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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: mutex_pool.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 20:24:55  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJECTS_OBJMGR___MUTEX_POOL__HPP
  10. #define OBJECTS_OBJMGR___MUTEX_POOL__HPP
  11. /*  $Id: mutex_pool.hpp,v 1000.0 2003/10/29 20:24:55 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: Eugene Vasilchenko
  37. *
  38. * File Description:
  39. *   CMutexPool -- to distribute mutex pool among several objects.
  40. *
  41. */
  42. #include <corelib/ncbistd.hpp>
  43. #include <corelib/ncbiobj.hpp>
  44. #include <corelib/ncbimtx.hpp>
  45. #include <list>
  46. BEGIN_NCBI_SCOPE
  47. BEGIN_SCOPE(objects)
  48. class CInitMutexPool;
  49. class CInitMutex_Base;
  50. class CInitGuard;
  51. ////////////////////////////////////////////////////////////////////
  52. //
  53. //  CMutexPool::
  54. //
  55. //    Distribute a mutex pool among multiple objects
  56. //
  57. class NCBI_XOBJMGR_EXPORT CInitMutexPool
  58. {
  59. public:
  60.     CInitMutexPool(void);
  61.     ~CInitMutexPool(void);
  62.     class NCBI_XOBJMGR_EXPORT CPoolMutex : public CObject
  63.     {
  64.     public:
  65.         CPoolMutex(CInitMutexPool& pool)
  66.             : m_Pool(pool)
  67.             {
  68.             }
  69.         ~CPoolMutex(void)
  70.             {
  71.             }
  72.         CInitMutexPool& GetPool(void) const
  73.             {
  74.                 return m_Pool;
  75.             }
  76.         CMutex& GetMutex(void)
  77.             {
  78.                 return m_Mutex;
  79.             }
  80.     private:
  81.         CInitMutexPool& m_Pool;
  82.         CMutex      m_Mutex;
  83.     };
  84.     typedef CPoolMutex TMutex;
  85. protected:
  86.     friend class CInitGuard;
  87.     bool AcquireMutex(CInitMutex_Base& init, CRef<TMutex>& mutex);
  88.     void ReleaseMutex(CInitMutex_Base& init, CRef<TMutex>& mutex);
  89. private:
  90.     typedef list< CRef<TMutex> > TMutexList;
  91.     TMutexList m_MutexList;
  92.     CFastMutex m_Pool_Mtx;
  93. private:
  94.     CInitMutexPool(const CInitMutexPool&);
  95.     const CInitMutexPool& operator=(const CInitMutexPool&);
  96. };
  97. class NCBI_XOBJMGR_EXPORT CInitMutex_Base
  98. {
  99. public:
  100.     operator bool(void) const
  101.         {
  102.             return m_Object;
  103.         }
  104.     bool operator!(void) const
  105.         {
  106.             return !m_Object;
  107.         }
  108. protected:
  109.     CInitMutex_Base(void)
  110.         {
  111.         }
  112.     CInitMutex_Base(const CInitMutex_Base& _DEBUG_ARG(mutex))
  113.         {
  114.             _ASSERT(!mutex.m_Mutex && !mutex.m_Object);
  115.         }
  116.     ~CInitMutex_Base(void)
  117.         {
  118.             _ASSERT(!m_Mutex);
  119.         }
  120.     friend class CInitMutexPool;
  121.     typedef CInitMutexPool::TMutex TMutex;
  122.     CRef<TMutex>  m_Mutex;
  123.     CRef<CObject> m_Object;
  124. private:
  125.     const CInitMutex_Base& operator=(const CInitMutex_Base&);
  126. };
  127. template<class C>
  128. class NCBI_XOBJMGR_EXPORT CInitMutex : public CInitMutex_Base
  129. {
  130. public:
  131.     typedef C TObjectType;
  132.     void Reset(void)
  133.         {
  134.             m_Object.Reset();
  135.         }
  136.     void Reset(TObjectType* object)
  137.         {
  138.             m_Object.Reset(object);
  139.         }
  140.     inline
  141.     TObjectType& GetObject(void)
  142.         {
  143.             return static_cast<TObjectType&>(m_Object.GetObject());
  144.         }
  145.     inline
  146.     const TObjectType& GetObject(void) const
  147.         {
  148.             return static_cast<const TObjectType&>(m_Object.GetObject());
  149.         }
  150.     inline
  151.     TObjectType* GetPointer(void)
  152.         {
  153.             return static_cast<TObjectType*>(m_Object.GetPointer());
  154.         }
  155.     inline
  156.     const TObjectType* GetPointer(void) const
  157.         {
  158.             return static_cast<const TObjectType*>(m_Object.GetPointer());
  159.         }
  160.     inline
  161.     TObjectType* GetPointerOrNull(void)
  162.         {
  163.             return static_cast<TObjectType*>(m_Object.GetPointerOrNull());
  164.         }
  165.     inline
  166.     const TObjectType* GetPointerOrNull(void) const
  167.         {
  168.             return
  169.                 static_cast<const TObjectType*>(m_Object.GetPointerOrNull());
  170.         }
  171.     inline
  172.     TObjectType& operator*(void)
  173.         {
  174.             return GetObject();
  175.         }
  176.     inline
  177.     TObjectType* operator->(void)
  178.         {
  179.             return GetPointer();
  180.         }
  181.     inline
  182.     const TObjectType& operator*(void) const
  183.         {
  184.             return GetObject();
  185.         }
  186.     inline
  187.     const TObjectType* operator->(void) const
  188.         {
  189.             return GetPointer();
  190.         }
  191.     const CInitMutex<TObjectType>& operator=(const CRef<TObjectType>& ref)
  192.         {
  193.             m_Object.Reset(const_cast<TObjectType*>(ref.GetPointerOrNull()));
  194.             return *this;
  195.         }
  196.     operator CRef<TObjectType>(void) const
  197.         {
  198.             return CRef<TObjectType>(const_cast<TObjectType*>(GetPointer()));
  199.         }
  200.     operator CConstRef<TObjectType>(void) const
  201.         {
  202.             return CConstRef<TObjectType>(GetPointer());
  203.         }
  204. };
  205. class NCBI_XOBJMGR_EXPORT CInitGuard
  206. {
  207. public:
  208.     CInitGuard(CInitMutex_Base& init, CInitMutexPool& pool)
  209.         : m_Init(init)
  210.         {
  211.             if ( !init && pool.AcquireMutex(init, m_Mutex) ) {
  212.                 m_Guard.Guard(m_Mutex->GetMutex());
  213.                 if ( init ) {
  214.                     x_Release();
  215.                 }
  216.             }
  217.         }
  218.     ~CInitGuard(void)
  219.         {
  220.             Release();
  221.         }
  222.     void Release(void)
  223.         {
  224.             if ( m_Mutex ) {
  225.                 x_Release();
  226.             }
  227.         }
  228.     // true means that this thread should perform initialization
  229.     operator bool(void) const
  230.         {
  231.             return !m_Init;
  232.         }
  233. protected:
  234.     typedef CInitMutexPool::TMutex TMutex;
  235.     void x_Release(void)
  236.         {
  237.             m_Mutex->GetPool().ReleaseMutex(m_Init, m_Mutex);
  238.             m_Guard.Release();
  239.         }
  240.     CInitMutex_Base& m_Init;
  241.     CRef<TMutex>     m_Mutex;
  242.     CMutexGuard      m_Guard;
  243. private:
  244.     CInitGuard(const CInitGuard&);
  245.     const CInitGuard& operator=(const CInitGuard&);
  246. };
  247. END_SCOPE(objects)
  248. END_NCBI_SCOPE
  249. /*
  250. * ---------------------------------------------------------------------------
  251. * $Log: mutex_pool.hpp,v $
  252. * Revision 1000.0  2003/10/29 20:24:55  gouriano
  253. * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.3
  254. *
  255. * Revision 1.3  2003/07/01 18:02:37  vasilche
  256. * Removed invalid assert.
  257. * Moved asserts from .hpp to .cpp file.
  258. *
  259. * Revision 1.2  2003/06/25 17:09:27  vasilche
  260. * Fixed locking in CInitMutexPool.
  261. *
  262. * Revision 1.1  2003/06/19 18:23:45  vasilche
  263. * Added several CXxx_ScopeInfo classes for CScope related information.
  264. * CBioseq_Handle now uses reference to CBioseq_ScopeInfo.
  265. * Some fine tuning of locking in CScope.
  266. *
  267. * Revision 1.4  2003/04/24 16:12:37  vasilche
  268. * Object manager internal structures are splitted more straightforward.
  269. * Removed excessive header dependencies.
  270. *
  271. * Revision 1.3  2003/03/03 18:46:45  dicuccio
  272. * Removed unnecessary Win32 export specifier
  273. *
  274. * Revision 1.2  2002/12/26 20:51:35  dicuccio
  275. * Added Win32 export specifier
  276. *
  277. * Revision 1.1  2002/07/08 20:35:50  grichenk
  278. * Initial revision
  279. *
  280. * Revision 1.4  2002/06/04 17:18:32  kimelman
  281. * memory cleanup :  new/delete/Cref rearrangements
  282. *
  283. * Revision 1.3  2002/05/06 03:30:36  vakatov
  284. * OM/OM1 renaming
  285. *
  286. * Revision 1.2  2002/02/25 21:05:27  grichenk
  287. * Removed seq-data references caching. Increased MT-safety. Fixed typos.
  288. *
  289. * Revision 1.1  2002/02/21 19:21:02  grichenk
  290. * Initial revision
  291. *
  292. *
  293. * ===========================================================================
  294. */
  295. #endif  /* OBJECTS_OBJMGR___MUTEX_POOL__HPP */