123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- #ifndef CRITSECTION_H
- #define CRITSECTION_H
- #include "sal.h"
- /**
- * Critical section
- * Critical Section object
- */
- class ThreadSection
- {
- public:
- ThreadSection()
- {
- HRESULT hr = Init();
- (hr);
- }
- ~ThreadSection()
- {
- DeleteCriticalSection(&_CriticalSection);
- }
- /// Enter/Lock a critical section
- bool Lock()
- {
- bool result = false;
- __try
- {
- EnterCriticalSection(&_CriticalSection);
- result = true;
- }
- __except(STATUS_NO_MEMORY == GetExceptionCode())
- {
- }
- return result;
- }
- /// Leave/Unlock a critical section
- bool Unlock()
- {
- bool result = false;
- __try
- {
- LeaveCriticalSection(&_CriticalSection);
- result = true;
- }
- __except(STATUS_NO_MEMORY == GetExceptionCode())
- {
- }
- return result;
- }
- private:
- /// Initialize critical section
- HRESULT Init() throw()
- {
- HRESULT hRes = E_FAIL;
- __try
- {
- InitializeCriticalSection(&_CriticalSection);
- hRes = S_OK;
- }
- // structured exception may be raised in low memory situations
- __except(STATUS_NO_MEMORY == GetExceptionCode())
- {
- hRes = E_OUTOFMEMORY;
- }
- return hRes;
- }
- ThreadSection(const ThreadSection & tSection);
- ThreadSection &operator=(const ThreadSection & tSection);
- CRITICAL_SECTION _CriticalSection;
- };
- /**
- * AutoThreadSection class
- * Critical section auto-lock
- */
- class AutoThreadSection
- {
- public:
- /// auto section - constructor
- AutoThreadSection(__in ThreadSection* pSection)
- {
- _pSection = pSection;
- _pSection->Lock();
- }
- ~AutoThreadSection()
- {
- _pSection->Unlock();
- }
- private:
- AutoThreadSection(const AutoThreadSection & tSection);
- AutoThreadSection &operator=(const AutoThreadSection & tSection);
- ThreadSection * _pSection;
- };
- #endif //CRITSECTION_H
|