test_objmgr_gbloader_mt.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:12k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_objmgr_gbloader_mt.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:42:24  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_objmgr_gbloader_mt.cpp,v 1000.1 2004/06/01 19:42:24 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Author:
  35. *           Andrei Gourianov, Michael Kimelman
  36. *
  37. * File Description:
  38. *           Basic test of GenBank data loader
  39. *
  40. * ===========================================================================
  41. */
  42. #include <ncbi_pch.hpp>
  43. #include <corelib/ncbiapp.hpp>
  44. #include <objects/seq/Bioseq.hpp>
  45. #include <objects/seqloc/Seq_id.hpp>
  46. #include <objmgr/object_manager.hpp>
  47. #include <objmgr/scope.hpp>
  48. #include <objmgr/bioseq_handle.hpp>
  49. #include <objtools/data_loaders/genbank/gbloader.hpp>
  50. #include <serial/serial.hpp>
  51. #include <serial/objostrasn.hpp>
  52. #include <connect/ncbi_core_cxx.hpp>
  53. #include <connect/ncbi_util.h>
  54. BEGIN_NCBI_SCOPE
  55. using namespace objects;
  56. /////////////////////////////////////////////////////////////////////////////
  57. //
  58. //  Test thread
  59. //
  60. class CTestThread : public CThread
  61. {
  62. public:
  63.   CTestThread(unsigned id, CObjectManager& objmgr, CScope& scope,int start,int stop);
  64.   virtual ~CTestThread();
  65.   
  66. protected:
  67.     virtual void* Main(void);
  68. private:
  69.   unsigned        m_mode;
  70.   CScope         *m_Scope;
  71.   CObjectManager *m_ObjMgr;
  72.   int             m_Start;
  73.   int             m_Stop;
  74. };
  75. CTestThread::CTestThread(unsigned id, CObjectManager& objmgr, CScope& scope,int start,int stop)
  76.     : m_mode(id), m_Scope(&scope), m_ObjMgr(&objmgr), m_Start(start), m_Stop(stop)
  77. {
  78.   LOG_POST("Thread " << start << " - " << stop << " - started");
  79. }
  80. CTestThread::~CTestThread()
  81. {
  82.   LOG_POST("Thread " << m_Start << " - " << m_Stop << " - completed");
  83. }
  84. void* CTestThread::Main(void)
  85. {
  86.     CObjectManager om;
  87.     CObjectManager *pom=0;
  88.     switch((m_mode>>2)&1) {
  89.     case 1: pom =  &*m_ObjMgr; break;
  90.     case 0:
  91.         pom =  &om;
  92.         om.RegisterDataLoader(*new CGBDataLoader("ID",0,2),CObjectManager::eDefault);
  93.         break;
  94.     }
  95.   
  96.     CScope scope1(*pom);
  97.     scope1.AddDefaults();
  98.     LOG_POST(" Processing gis from "<< m_Start << " to " << m_Stop);
  99.   
  100.     for (int i = m_Start;  i < m_Stop;  i++) {
  101.         CScope scope2(*pom);
  102.         scope2.AddDefaults();
  103.         CScope *s;
  104.         switch(m_mode&3) {
  105.         case 2: s =  &*m_Scope; break;
  106.         case 1: s =  &scope1;   break;
  107.         case 0: s =  &scope2;   break;
  108.         default:
  109.             throw runtime_error("unexpected mode");
  110.         }
  111.     
  112.         int gi = i ; // (i + m_Idx)/2+3;
  113.         CSeq_id x;
  114.         x.SetGi(gi);
  115.         CBioseq_Handle h = s->GetBioseqHandle(x);
  116.         if ( !h ) {
  117.             LOG_POST(setw(3) << CThread::GetSelf() << ":: gi=" << gi << " :: not found in ID");
  118.         } else {
  119.             //CObjectOStreamAsn oos(NcbiCout);
  120.             CConstRef<CBioseq> core = h.GetBioseqCore();
  121.             ITERATE (list<CRef<CSeq_id> >, it, core->GetId()) {
  122.                 //oos << **it;
  123.                 //NcbiCout << NcbiEndl;
  124.                 ;
  125.             }
  126.             LOG_POST(setw(3) << CThread::GetSelf() << ":: gi=" << gi << " OK");
  127.         }
  128.         s->ResetHistory();
  129.     }
  130.     return 0;
  131. }
  132. /////////////////////////////////////////////////////////////////////////////
  133. //
  134. //  CTestApplication::
  135. //
  136. class CTestApplication : public CNcbiApplication
  137. {
  138. public:
  139.     virtual int Run(void);
  140.     int Test(const unsigned test_id,const unsigned thread_count);
  141. };
  142. const unsigned c_TestFrom = 1;
  143. const unsigned c_TestTo   = 201;
  144. const unsigned c_GI_count = c_TestTo - c_TestFrom;
  145. int CTestApplication::Test(const unsigned test_mode,const unsigned thread_count)
  146. {
  147.   int step= c_GI_count/thread_count;
  148.   CObjectManager Om;
  149.   CScope         scope(Om);
  150.   typedef CTestThread* CTestThreadPtr;
  151.   
  152.   CTestThreadPtr  *thr = new CTestThreadPtr[thread_count];
  153.   
  154.   // CRef< CGBDataLoader> pLoader = new CGBDataLoader;
  155.   // pOm->RegisterDataLoader(*pLoader, CObjectManager::eDefault);
  156.   if(((test_mode>>2)&1)==1)
  157.     {
  158.       Om.RegisterDataLoader(*new CGBDataLoader("ID", 0,1+2*thread_count),
  159.                             CObjectManager::eDefault);
  160.       scope.AddDefaults();
  161.     }
  162.     
  163.   for (unsigned i=0; i<thread_count; ++i)
  164.     {
  165.       thr[i] = new CTestThread(test_mode, Om, scope,c_TestFrom+i*step,c_TestFrom+(i+1)*step);
  166.       thr[i]->Run(CThread::fRunAllowST);
  167.     }
  168.     
  169.   for (unsigned i=0; i<thread_count; i++) {
  170.     LOG_POST("Thread " << i << " @join");
  171.     thr[i]->Join();
  172.   }
  173.     
  174. #if 0 
  175.   // Destroy all threads : has already been destroyed by join
  176.   for (unsigned i=0; i<thread_count; i++) {
  177.     LOG_POST("Thread " << i << " @delete");
  178.     delete thr[i];
  179.   }
  180. #endif
  181.     
  182.   delete [] thr;
  183.   return 0;
  184. }
  185. int CTestApplication::Run()
  186. {
  187.   unsigned timing[4/*threads*/][2/*om*/][3/*scope*/];
  188.   unsigned tc = sizeof(timing)/sizeof(*timing);
  189.   memset(timing,0,sizeof(timing));
  190.   
  191.   CORE_SetLOCK(MT_LOCK_cxx2c());
  192.   CORE_SetLOG(LOG_cxx2c());
  193.   {
  194.     time_t x = time(0);
  195.     LOG_POST("START: " << time(0) );
  196. #if defined(HAVE_PUBSEQ_OS)
  197.     {
  198.       CGBDataLoader preload_ctlib_("ID", 0,1);
  199.     }
  200.     LOG_POST("CTLIB loaded: " << time(0)-x  );
  201. #endif
  202.   }
  203.   
  204.   for(unsigned thr=tc,i=0 ; thr > 0 ; --thr)
  205.     for(unsigned global_om=0;global_om<=(thr>1U?1U:0U); ++global_om)
  206.       for(unsigned global_scope=0;global_scope<=(thr==1U?1U:(global_om==0U?1U:2U)); ++global_scope)
  207.         {
  208.           unsigned mode = (global_om<<2) + global_scope ;
  209.           LOG_POST("TEST: threads:" << thr << ", om=" << (global_om?"global":"local ") <<
  210.                    ", scope=" << (global_scope==0?"auto      ":(global_scope==1?"per thread":"global    ")));
  211.           time_t start=time(0);
  212.           Test(mode,thr);
  213.           timing[thr-1][global_om][global_scope] = time(0)-start ;
  214.           LOG_POST("==================================================");
  215.           LOG_POST("Test(" << i++ << ") completed  ===============");
  216.         }
  217.   
  218.   for(unsigned global_om=0;global_om<=1; ++global_om)
  219.     for(unsigned global_scope=0;global_scope<=2; ++global_scope)
  220.       for(unsigned thr=0; thr < tc ; ++thr)
  221.         {
  222.           if(timing[thr][global_om][global_scope]==0) continue;
  223.           if(timing[thr][global_om][global_scope]>0)
  224.           LOG_POST("TEST: threads:" << thr+1 << ", om=" << (global_om?"global":"local ") <<
  225.                    ", scope=" << (global_scope==0?"auto      ":(global_scope==1?"per thread":"global    ")) <<
  226.                    " ==>> " << timing[thr][global_om][global_scope] << " sec");
  227.         }
  228.   
  229.   LOG_POST("Tests completed");
  230.   return 0;
  231. }
  232. END_NCBI_SCOPE
  233. /////////////////////////////////////////////////////////////////////////////
  234. //
  235. //  MAIN
  236. //
  237. USING_NCBI_SCOPE;
  238. int main(int argc, const char* argv[])
  239. {
  240.   return CTestApplication().AppMain(argc, argv, 0, eDS_Default, 0);
  241. }
  242. /*
  243. * ---------------------------------------------------------------------------
  244. * $Log: test_objmgr_gbloader_mt.cpp,v $
  245. * Revision 1000.1  2004/06/01 19:42:24  gouriano
  246. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  247. *
  248. * Revision 1.3  2004/05/21 21:42:52  gorelenk
  249. * Added PCH ncbi_pch.hpp
  250. *
  251. * Revision 1.2  2004/03/16 15:47:29  vasilche
  252. * Added CBioseq_set_Handle and set of EditHandles
  253. *
  254. * Revision 1.1  2003/12/16 17:51:20  kuznets
  255. * Code reorganization
  256. *
  257. * Revision 1.24  2003/06/02 16:06:39  dicuccio
  258. * Rearranged src/objects/ subtree.  This includes the following shifts:
  259. *     - src/objects/asn2asn --> arc/app/asn2asn
  260. *     - src/objects/testmedline --> src/objects/ncbimime/test
  261. *     - src/objects/objmgr --> src/objmgr
  262. *     - src/objects/util --> src/objmgr/util
  263. *     - src/objects/alnmgr --> src/objtools/alnmgr
  264. *     - src/objects/flat --> src/objtools/flat
  265. *     - src/objects/validator --> src/objtools/validator
  266. *     - src/objects/cddalignview --> src/objtools/cddalignview
  267. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  268. * replaces the three libmmdb? libs.
  269. *
  270. * Revision 1.23  2003/05/08 20:50:14  grichenk
  271. * Allow MT tests to run in ST mode using CThread::fRunAllowST flag.
  272. *
  273. * Revision 1.22  2003/04/24 16:12:39  vasilche
  274. * Object manager internal structures are splitted more straightforward.
  275. * Removed excessive header dependencies.
  276. *
  277. * Revision 1.21  2003/04/15 14:23:11  vasilche
  278. * Added missing includes.
  279. *
  280. * Revision 1.20  2003/03/27 21:54:58  grichenk
  281. * Renamed test applications and makefiles, updated references
  282. *
  283. * Revision 1.19  2003/03/11 15:51:06  kuznets
  284. * iterate -> ITERATE
  285. *
  286. * Revision 1.18  2002/07/23 15:32:49  kimelman
  287. * tuning test
  288. *
  289. * Revision 1.17  2002/07/22 22:49:05  kimelman
  290. * test fixes for confidential data retrieval
  291. *
  292. * Revision 1.16  2002/06/06 20:42:17  kimelman
  293. * cosmetics
  294. *
  295. * Revision 1.15  2002/06/06 06:17:07  vakatov
  296. * Workaround a weird compiler bug (WorkShop 5.3 on INTEL in ReleaseMT mode)
  297. *
  298. * Revision 1.14  2002/06/04 17:18:33  kimelman
  299. * memory cleanup :  new/delete/Cref rearrangements
  300. *
  301. * Revision 1.13  2002/05/08 22:23:49  kimelman
  302. * MT fixes
  303. *
  304. * Revision 1.12  2002/05/06 03:28:53  vakatov
  305. * OM/OM1 renaming
  306. *
  307. * Revision 1.11  2002/04/18 23:24:24  kimelman
  308. * bugfix: out of bounds...
  309. *
  310. * Revision 1.10  2002/04/12 22:57:34  kimelman
  311. * warnings cleanup(linux-gcc)
  312. *
  313. * Revision 1.9  2002/04/12 21:10:35  kimelman
  314. * traps for coredumps
  315. *
  316. * Revision 1.8  2002/04/11 20:03:29  kimelman
  317. * switch to pubseq
  318. *
  319. * Revision 1.7  2002/04/09 18:48:17  kimelman
  320. * portability bugfixes: to compile on IRIX, sparc gcc
  321. *
  322. * Revision 1.6  2002/04/05 23:47:20  kimelman
  323. * playing around tests
  324. *
  325. * Revision 1.5  2002/04/05 19:53:13  gouriano
  326. * reset scope history more accurately (was incorrect)
  327. *
  328. * Revision 1.4  2002/04/04 01:35:38  kimelman
  329. * more MT tests
  330. *
  331. * Revision 1.3  2002/04/02 17:24:54  gouriano
  332. * skip useless test passes
  333. *
  334. * Revision 1.2  2002/04/02 16:02:33  kimelman
  335. * MT testing
  336. *
  337. * Revision 1.1  2002/03/30 19:37:08  kimelman
  338. * gbloader MT test
  339. *
  340. * Revision 1.9  2002/03/26 17:24:58  grichenk
  341. * Removed extra ++i
  342. *
  343. * Revision 1.8  2002/03/26 15:40:31  kimelman
  344. * get rid of catch clause
  345. *
  346. * Revision 1.7  2002/03/26 00:15:52  vakatov
  347. * minor beautification
  348. *
  349. * Revision 1.6  2002/03/25 15:44:47  kimelman
  350. * proper logging and exception handling
  351. *
  352. * Revision 1.5  2002/03/22 21:53:07  kimelman
  353. * bugfix: skip missed gi's
  354. *
  355. * Revision 1.4  2002/03/21 19:15:53  kimelman
  356. * GB related bugfixes
  357. *
  358. * Revision 1.3  2002/03/21 19:14:55  kimelman
  359. * GB related bugfixes
  360. *
  361. * Revision 1.2  2002/03/21 16:18:21  gouriano
  362. * *** empty log message ***
  363. *
  364. * Revision 1.1  2002/03/20 21:25:00  gouriano
  365. * *** empty log message ***
  366. *
  367. * ===========================================================================
  368. */