CritSect.h 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #pragma once
  2. #include "../Common.h"
  3. NS_BF_BEGIN;
  4. class CritSect
  5. {
  6. public:
  7. BfpCritSect* mCritSect;
  8. int32 mLockCount;
  9. public:
  10. CritSect()
  11. {
  12. mCritSect = BfpCritSect_Create();
  13. mLockCount = 0;
  14. }
  15. ~CritSect()
  16. {
  17. BfpCritSect_Release(mCritSect);
  18. BF_ASSERT(mLockCount == 0);
  19. }
  20. bool TryLock()
  21. {
  22. bool locked = BfpCritSect_TryEnter(mCritSect, 0);
  23. if (locked)
  24. mLockCount++;
  25. return locked;
  26. }
  27. bool TryLock(int waitMS)
  28. {
  29. bool locked = BfpCritSect_TryEnter(mCritSect, waitMS);
  30. if (locked)
  31. mLockCount++;
  32. return locked;
  33. }
  34. void Lock()
  35. {
  36. BfpCritSect_Enter(mCritSect);
  37. mLockCount++;
  38. }
  39. void Unlock()
  40. {
  41. mLockCount--;
  42. BfpCritSect_Leave(mCritSect);
  43. }
  44. };
  45. class SyncEvent
  46. {
  47. public:
  48. BfpEvent* mEvent;
  49. public:
  50. SyncEvent(bool manualReset = false, bool initialState = false)
  51. {
  52. BfpEventFlags flags = (manualReset) ? BfpEventFlag_AllowManualReset : (BfpEventFlags)(BfpEventFlag_AllowAutoReset | BfpEventFlag_AllowManualReset);
  53. if (initialState)
  54. flags = (BfpEventFlags)(flags | (manualReset ? BfpEventFlag_InitiallySet_Manual : BfpEventFlag_InitiallySet_Auto));
  55. mEvent = BfpEvent_Create(flags);
  56. }
  57. ~SyncEvent()
  58. {
  59. BfpEvent_Release(mEvent);
  60. }
  61. void Set(bool requireManualReset = false)
  62. {
  63. BfpEvent_Set(mEvent, requireManualReset);
  64. }
  65. void Reset()
  66. {
  67. BfpEvent_Reset(mEvent, NULL);
  68. }
  69. bool WaitFor(int timeoutMS = -1)
  70. {
  71. return BfpEvent_WaitFor(mEvent, timeoutMS);
  72. }
  73. };
  74. class AutoCrit
  75. {
  76. public:
  77. CritSect* mCritSect;
  78. public:
  79. AutoCrit(CritSect& critSect)
  80. {
  81. mCritSect = &critSect;
  82. mCritSect->Lock();
  83. }
  84. ~AutoCrit()
  85. {
  86. mCritSect->Unlock();
  87. }
  88. };
  89. NS_BF_END;