17#pragma comment(user,"T-Coverage Disable")
50 virtual bool Lock(DWORD dwTime = INFINITE)
const = 0;
80 operator HANDLE(
void)
const
91 virtual bool Lock(DWORD dwTime = INFINITE)
const
96 DWORD dwRc = ::WaitForSingleObject(h, dwTime);
97 ASSERTLIB(dwRc != WAIT_FAILED);
98 if ( dwRc == WAIT_OBJECT_0 )
131 ::InitializeCriticalSection(&m_cs);
137 ::DeleteCriticalSection(&m_cs);
148 virtual bool Lock(DWORD dwTime = INFINITE)
const
150 ::EnterCriticalSection(&m_cs);
157 ::LeaveCriticalSection(&m_cs);
161 mutable CRITICAL_SECTION m_cs;
200 if ( m_hModule != NULL )
202 ::FreeLibrary(m_hModule);
213 virtual bool Lock(DWORD dwTime = INFINITE)
const
215 if ( dwTime == INFINITE )
217 return _super::Lock(dwTime);
219 if ( m_hModule == NULL )
221 m_hModule = ::LoadLibraryA(
"kernel32.dll");
222 m_pTryEntryCs =
reinterpret_cast<P_TryEntryCs
>(::GetProcAddressA(m_hModule,
"TryEnterCriticalSection"));
224 if ( m_pTryEntryCs == NULL )
226 ASSERT0(
false,
"CSyncSectionEx::Lock()",
227 "API 'TryEnterCriticalSection()' が見つかりません。\nOS がNT4.0以降でない可能性があります。");
232 return !! m_pTryEntryCs(&m_cs);
237 if ( m_pTryEntryCs(&m_cs) )
247 typedef DWORD (WINAPI* P_TryEntryCs)(LPCRITICAL_SECTION);
248 mutable P_TryEntryCs m_pTryEntryCs;
249 mutable HMODULE m_hModule;
283 explicit CSyncMutex(
bool boIsLock =
false, LPCTSTR lpszName = NULL) : _super()
285 m_hMutex = ::CreateMutex(NULL, boIsLock, lpszName);
286 DWORD r = ::GetLastError();
287 if ( r != 0 && r != 0xB7 )
289 _GetLastError(
"CreateMutex");
293 "CSyncMutex::CSyncMutex()",
296 if ( m_hMutex == NULL )
310 if ( m_hMutex == NULL )
319 if ( m_hMutex != NULL )
321 ::ReleaseMutex(m_hMutex);
322 ::CloseHandle(m_hMutex);
329 if ( m_hMutex != NULL )
331 ::ReleaseMutex(m_hMutex);
382 explicit CSyncSemaphore(LPCTSTR lpszName = NULL,
int iMaximumCount = 1) : _super()
384 m_hSema = ::CreateSemaphore(NULL, iMaximumCount, iMaximumCount, lpszName);
387 "CSyncSemaphore::CSyncSemaphore()",
388 "Semaphoreが初期化できませんした。"
390 if ( m_hSema == NULL )
404 if ( m_hSema == NULL )
413 if ( m_hSema != NULL )
415 ::ReleaseSemaphore(m_hSema, 1, NULL);
416 ::CloseHandle(m_hSema);
423 if ( m_hSema != NULL )
425 ::ReleaseSemaphore(m_hSema, 1, NULL);
437 if ( m_hSema != NULL )
439 ::ReleaseSemaphore(m_hSema, lCount, &l);
493 CSyncEvent(
bool boIsManualReset =
false,
bool boIsLock =
false, LPCTSTR lpszName = NULL) : _super()
495 m_hEvent = ::CreateEvent(NULL, boIsManualReset, ! boIsLock, lpszName);
498 "CSyncEvent::CSyncEvent()",
499 "Eventが初期化できませんした。名前に問題がある可能性が有ります。"
501 if ( m_hEvent == NULL )
515 if ( m_hEvent == NULL )
524 if ( m_hEvent != NULL )
526 ::SetEvent(m_hEvent);
527 ::CloseHandle(m_hEvent);
534 if ( m_hEvent != NULL )
536 ::SetEvent(m_hEvent);
546 if ( m_hEvent != NULL )
548 ::ResetEvent(m_hEvent);
558 if ( m_hEvent != NULL )
560 ::PulseEvent(m_hEvent);
610 "CSyncCounter::~CSyncCounter()",
611 "内部ロックカウントの数が合いません。\n\tLock()とUnlock()回数があっていない可能性が有ります。"
621 virtual bool Lock(DWORD dwTime = INFINITE)
const
627 else if ( dwTime == INFINITE )
656 if ( ::InterlockedDecrement(&m_lCounter) < 0 )
658 ASSERT0(
false,
"CSyncCounter::Unlock()",
"Unlock()回数がLock()よりも多いです。");
659 ::InterlockedExchange(&m_lCounter, 0);
664 mutable LONG m_lCounter;
668 bool m_check(
void)
const
670 if ( ::InterlockedIncrement(&m_lCounter) <= m_lMax )
674 ::InterlockedDecrement(&m_lCounter);
706 virtual bool Lock(DWORD dwTime = INFINITE)
const
742 if ( m_psyncObj == NULL )
788#define EXCLUSIVE(CLS) CExclusive _cExclus_(CLS);
802#define EXCLUSIVE_(CLS) \
803 TRACE3("%s(%d):[%d] Lock要求\n",_T(__FILE__),__LINE__,::GetCurrentThreadId()); \
804 CExclusive _cExclus_(CLS); \
805 TRACE3("%s(%d):[%d] Lock成功\n",_T(__FILE__),__LINE__,::GetCurrentThreadId());
820#define EXCLUSIVE2(CLS1,CLS2) CExclusive _cExclus1_(CLS1); CExclusive _cExclus2_(CLS2);
835#define EXCLUSIVE2_(CLS1,CLS2) \
836 TRACE3("%s(%d):[%d] Lock要求\n",_T(__FILE__),__LINE__,::GetCurrentThreadId()); \
837 CExclusive _cExclus1_(CLS1); CExclusive _cExclus2_(CLS2); \
838 TRACE3("%s(%d):[%d] Lock成功\n",_T(__FILE__),__LINE__,::GetCurrentThreadId());
912#define SYNCBLOCK(CLS) if (false); else for ( CExclusiveEx _cExclusEx_(CLS); _cExclusEx_ == 0; )
921#pragma comment(user,"T-Coverage Enable")
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
virtual HANDLE GetHandle(void) const =0
[取得] ハンドル取得
CExclusiveEx(const ISynchronized *P)
コンストラクタ
CExclusive(const ISynchronized *P)
コンストラクタ
virtual ~CSyncCounter(void)
デストラクタ
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
CSyncCounter(LONG lMax=1)
コンストラクタ
virtual void Unlock(void) const
[排他] アンロック
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
virtual void Unlock(void) const
[排他] アンロック
virtual ~CSyncDummy(void)
デストラクタ
CSyncEvent(bool boIsManualReset=false, bool boIsLock=false, LPCTSTR lpszName=NULL)
コンストラクタ
void ToLock(void)
[排他] ロック状態にする
CSyncEvent(HANDLE hEvent)
コンストラクタ
virtual ~CSyncEvent(void)
デストラクタ
void Pulse(void)
[排他] ロック状態にする
virtual HANDLE GetHandle(void) const
[取得] Mutexハンドル取得
virtual void Unlock(void) const
[排他] アンロック
CSyncMutex(bool boIsLock=false, LPCTSTR lpszName=NULL)
コンストラクタ
virtual ~CSyncMutex(void)
デストラクタ
CSyncMutex(HANDLE hMutex)
コンストラクタ
virtual HANDLE GetHandle(void) const
[取得] Mutexハンドル取得
virtual void Unlock(void) const
[排他] アンロック
virtual ~CSyncSectionEx(void)
デストラクタ
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
CSyncSectionEx(void)
コンストラクタ
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
CSyncSection(void)
コンストラクタ
virtual ~CSyncSection(void)
デストラクタ
virtual void Unlock(void) const
[排他] アンロック
CSyncSemaphore(HANDLE hSema)
コンストラクタ
CSyncSemaphore(LPCTSTR lpszName=NULL, int iMaximumCount=1)
コンストラクタ
virtual HANDLE GetHandle(void) const
[取得] Mutexハンドル取得
virtual ~CSyncSemaphore(void)
デストラクタ
LONG Unlock(LONG lCount) const
[排他] アンロック
virtual void Unlock(void) const
[排他] アンロック
bool IsPassed(DWORD dwTime) const
[確認] 経過確認.
virtual ~ISynchronized(void)
デストラクタ
virtual bool Lock(DWORD dwTime=INFINITE) const =0
[排他] ロック
virtual void Unlock(void) const =0
[排他] アンロック