LockMgr.h
上传用户:jstlsd
上传日期:2007-01-13
资源大小:186k
文件大小:3k
源码类别:

钩子与API截获

开发平台:

Visual C++

  1. //---------------------------------------------------------------------------
  2. //
  3. // LockMgr.h
  4. //
  5. // SUBSYSTEM: 
  6. // Generic libraries
  7. // MODULE:    
  8. // 1. Interface and implementation for the CLockMgr class template.
  9. //              2. Interface declaration of CCSWrapper CRITICAL_SECTION wrapper 
  10. //
  11. // DESCRIPTION:
  12. //              
  13. //
  14. // AUTHOR: Ivo Ivanov (ivopi@hotmail.com)
  15. // DATE: 2001 November 13,  version 1.0 
  16. //                                                                         
  17. //---------------------------------------------------------------------------
  18. #ifndef _LOCKMGR_H_
  19. #define _LOCKMGR_H_
  20. #if _MSC_VER > 1000
  21. #pragma once
  22. #endif // _MSC_VER > 1000
  23. #include <windows.h>
  24. //---------------------------------------------------------------------------
  25. //
  26. // class CCSWrapper 
  27. //
  28. // Win32 CRTICIAL_SECTION user object wrapper
  29. //
  30. //---------------------------------------------------------------------------
  31. class CCSWrapper
  32. {
  33. public:
  34. CCSWrapper();
  35. virtual ~CCSWrapper();
  36. // 
  37. // This function waits for ownership of the specified critical section object 
  38. // 
  39. void Enter();
  40. //
  41. // Releases ownership of the specified critical section object. 
  42. // 
  43. void Leave();
  44. private:
  45. CRITICAL_SECTION m_cs;
  46. long m_nSpinCount;
  47. };
  48. //---------------------------------------------------------------------------
  49. //
  50. // class CLockMgr  
  51. //
  52. // Provides the access-control mechanism used in controlling access to a resource 
  53. // in a multithreaded environment. This class is used in combination with 
  54. // CCSWrapper and rather than direct calls for locking and unlocking shared 
  55. // resources, it performs it in the constructor and the destructor of the class. 
  56. // Having this approach we can just simply instantiate an object of type CCSWrapper 
  57. // on the stack in the beginning of the target method. The object will be 
  58. // automatically released when it goes out of the scope. This solves the issues 
  59. // with exception handling of the protected by CCSWrapper code.
  60. //
  61. //---------------------------------------------------------------------------
  62. template <class T>
  63. class CLockMgr  
  64. {
  65. public:
  66. //
  67. // Constructor
  68. //
  69. CLockMgr(T& lockObject, BOOL bEnabled):
  70. m_rLockObject( lockObject ),
  71. m_bEnabled( bEnabled )
  72. {
  73. if ( m_bEnabled )
  74. m_rLockObject.Enter();
  75. }
  76. //
  77. // Destructor
  78. //
  79. virtual ~CLockMgr()
  80. {
  81. if ( m_bEnabled )
  82. m_rLockObject.Leave();
  83. }
  84. private:
  85. T&   m_rLockObject;
  86. BOOL m_bEnabled;
  87. };
  88. #endif //_LOCKMGR_H_
  89. //--------------------- End of the file -------------------------------------