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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: gbload_util.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/04/12 17:37:37  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [CATCHUP_003] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GBLOADER_UTIL_HPP_INCLUDED
  10. #define GBLOADER_UTIL_HPP_INCLUDED
  11. /*  $Id: gbload_util.hpp,v 1000.0 2004/04/12 17:37:37 gouriano Exp $
  12. * ===========================================================================
  13. *
  14. *                            PUBLIC DOMAIN NOTICE
  15. *               National Center for Biotechnology Information
  16. *
  17. *  This software/database is a "United States Government Work" under the
  18. *  terms of the United States Copyright Act.  It was written as part of
  19. *  the author's official duties as a United States Government employee and
  20. *  thus cannot be copyrighted.  This software/database is freely available
  21. *  to the public for use. The National Library of Medicine and the U.S.
  22. *  Government have not placed any restriction on its use or reproduction.
  23. *
  24. *  Although all reasonable efforts have been taken to ensure the accuracy
  25. *  and reliability of the software and data, the NLM and the U.S.
  26. *  Government do not and cannot warrant the performance or results that
  27. *  may be obtained by using this software or data. The NLM and the U.S.
  28. *  Government disclaim all warranties, express or implied, including
  29. *  warranties of performance, merchantability or fitness for any particular
  30. *  purpose.
  31. *
  32. *  Please cite the author in any work or product based on this material.
  33. *
  34. *  ===========================================================================
  35. *
  36. *  Author: Michael Kimelman
  37. *
  38. *  File Description:
  39. *   GB loader Utilities
  40. *
  41. * ===========================================================================
  42. */
  43. #include <corelib/ncbistd.hpp>
  44. #include <corelib/ncbimtx.hpp>
  45. #include <corelib/ncbiobj.hpp>
  46. #include <corelib/ncbitime.hpp>
  47. BEGIN_NCBI_SCOPE
  48. BEGIN_SCOPE(objects)
  49. class NCBI_XLOADER_GENBANK_EXPORT CTimer
  50. {
  51. public:
  52.     CTimer(void);
  53.     time_t Time(void);
  54.     void   Start(void);
  55.     void   Stop(void);
  56.     time_t RetryTime(void);
  57.     bool   NeedCalibration(void);
  58. private:
  59.     time_t m_ReasonableRefreshDelay;
  60.     int    m_RequestsDevider;
  61.     int    m_Requests;
  62.     CMutex m_RequestsLock;
  63.     time_t m_Time;
  64.     time_t m_LastCalibrated;
  65.   
  66.     time_t m_StartTime;
  67.     CMutex m_TimerLock;
  68. };
  69. class NCBI_XLOADER_GENBANK_EXPORT CMutexPool
  70. {
  71. #if defined(NCBI_THREADS)
  72.     int         m_size;
  73.     CMutex     *m_Locks;
  74.     int        *spread;
  75. #else
  76.     static CMutex sm_Lock;
  77. #endif
  78. public:
  79. #if defined(NCBI_THREADS)
  80.     CMutexPool(void);
  81.     ~CMutexPool(void);
  82.     void SetSize(int size);
  83.     CMutex& GetMutex(int x)
  84.         {
  85.             int y=x%m_size; spread[y]++; return m_Locks[y];
  86.         }
  87.     int Select(unsigned key) const
  88.         {
  89.             return key % m_size;
  90.         }
  91.     template<class A> int  Select(A *a) const
  92.         {
  93.             return Select((unsigned long)a/sizeof(A));
  94.         }
  95. #else
  96.     CMutexPool(void)
  97.         {
  98.         }
  99.     ~CMutexPool(void)
  100.         {
  101.         }
  102.     void SetSize(int size)
  103.         {
  104.         }
  105.     CMutex& GetMutex(int x)
  106.         {
  107.             return sm_Lock;
  108.         }
  109.     int  Select(unsigned key) const
  110.         {
  111.             return 0;
  112.         }
  113.     template<class A> int  Select(A *a) const
  114.         {
  115.             return 0;
  116.         }
  117. #endif
  118. };
  119. class CGBLGuard
  120. {
  121. public:
  122.     enum EState
  123.     {
  124.         eNone,
  125.         eMain,
  126.         eBoth,
  127.         eLocal,
  128.         eNoneToMain,
  129.         eLast
  130.     };
  131.     struct SLeveledMutex
  132.     {
  133.         unsigned        m_SlowTraverseMode;
  134.         CMutex          m_Lookup;
  135.         CMutexPool      m_Pool;
  136.     };
  137.     typedef SLeveledMutex TLMutex;
  138. private:
  139.     TLMutex      *m_Locks;
  140.     const char   *m_Loc;
  141.     EState        m_orig;
  142.     EState        m_current;
  143.     int           m_select;
  144. public:
  145.     CGBLGuard(TLMutex& lm,EState orig,const char *loc="",int select=-1); // just accept start position
  146.     CGBLGuard(TLMutex& lm,const char *loc=""); // assume orig=eNone, switch to e.Main in constructor
  147.     CGBLGuard(CGBLGuard &g,const char *loc);   // inherit state from g1 - for SubGuards
  148.     ~CGBLGuard();
  149.     template<class A> void Lock(A *a)   { Switch(eBoth,a); }
  150.     template<class A> void Unlock(A *a) { Switch(eMain,a); }
  151.     void Lock(unsigned key)   { Switch(eBoth,key); }
  152.     void Unlock(unsigned key) { Switch(eMain,key); }
  153.     void Lock()   { Switch(eMain);};
  154.     void Unlock() { Switch(eNone);};
  155.     void Local()  { Switch(eLocal);};
  156.   
  157. private:
  158.   
  159. #if defined (NCBI_THREADS)
  160.     void MLock();
  161.     void MUnlock();
  162.     void PLock();
  163.     void PUnlock();
  164.     void Select(int s);
  165.     template<class A> void Switch(EState newstate,A *a)
  166.         {
  167.             Select(m_Locks->m_Pool.Select(a));
  168.             Switch(newstate);
  169.         }
  170.     void Switch(EState newstate,unsigned key)
  171.         {
  172.             Select(m_Locks->m_Pool.Select(key));
  173.             Switch(newstate);
  174.         }
  175.     void Switch(EState newstate);
  176. #else
  177.     void Switch(EState newstate) {}
  178.     template<class A> void Switch(EState newstate,A *a) {}
  179.     void Switch(EState newstate,unsigned key) {}
  180. #endif
  181. };
  182. END_SCOPE(objects)
  183. END_NCBI_SCOPE
  184. #endif
  185. /* ---------------------------------------------------------------------------
  186.  *
  187.  * $Log: gbload_util.hpp,v $
  188.  * Revision 1000.0  2004/04/12 17:37:37  gouriano
  189.  * PRODUCTION: IMPORTED [CATCHUP_003] Dev-tree R1.2
  190.  *
  191.  * Revision 1.2  2003/12/30 22:14:39  vasilche
  192.  * Updated genbank loader and readers plugins.
  193.  *
  194.  * Revision 1.2  2003/12/02 00:08:15  vasilche
  195.  * Fixed segfault in multithreaded apps.
  196.  *
  197.  * Revision 1.1  2003/11/26 17:55:55  vasilche
  198.  * Implemented ID2 split in ID1 cache.
  199.  * Fixed loading of splitted annotations.
  200.  *
  201.  * Revision 1.5  2003/06/02 16:06:37  dicuccio
  202.  * Rearranged src/objects/ subtree.  This includes the following shifts:
  203.  *     - src/objects/asn2asn --> arc/app/asn2asn
  204.  *     - src/objects/testmedline --> src/objects/ncbimime/test
  205.  *     - src/objects/objmgr --> src/objmgr
  206.  *     - src/objects/util --> src/objmgr/util
  207.  *     - src/objects/alnmgr --> src/objtools/alnmgr
  208.  *     - src/objects/flat --> src/objtools/flat
  209.  *     - src/objects/validator --> src/objtools/validator
  210.  *     - src/objects/cddalignview --> src/objtools/cddalignview
  211.  * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  212.  * replaces the three libmmdb? libs.
  213.  *
  214.  * Revision 1.4  2003/03/03 20:34:51  vasilche
  215.  * Added NCBI_THREADS macro - it's opposite to NCBI_NO_THREADS.
  216.  * Avoid using _REENTRANT macro - use NCBI_THREADS instead.
  217.  *
  218.  * Revision 1.3  2003/03/01 22:26:56  kimelman
  219.  * performance fixes
  220.  *
  221.  * Revision 1.2  2002/07/22 23:10:04  kimelman
  222.  * make sunWS happy
  223.  *
  224.  * Revision 1.1  2002/07/22 22:53:24  kimelman
  225.  * exception handling fixed: 2level mutexing moved to Guard class + added
  226.  * handling of confidential data.
  227.  *
  228.  */