Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
// sync.h -- defines the CSyncWith class
#ifndef __SYNC_H__
#define __SYNC_H__
class CITCriticalSection { public:
CITCriticalSection(); ~CITCriticalSection();
void Enter(); void Leave();
#ifdef _DEBUG
LONG LockCount();
#endif // _DEBUG
private: void Start(); void Stop();
CRITICAL_SECTION m_cs;
#ifdef _DEBUG
LONG m_ulOwningThread; LONG m_cLockRecursion;
#endif // _DEBUG
};
inline CITCriticalSection::CITCriticalSection() { Start(); }
inline void CITCriticalSection::Start() { InitializeCriticalSection(&m_cs);
#ifdef _DEBUG
m_ulOwningThread = ~0; m_cLockRecursion = 0;
#endif // _DEBUG
}
inline void CITCriticalSection::Stop() { DeleteCriticalSection(&m_cs); RonM_ASSERT(m_ulOwningThread == ~0); RonM_ASSERT(m_cLockRecursion == 0); }
inline CITCriticalSection::~CITCriticalSection() { Stop(); }
inline void CITCriticalSection::Enter() { ::EnterCriticalSection(&m_cs);
#ifdef _DEBUG
RonM_ASSERT(m_cLockRecursion || m_ulOwningThread == ~0);
if (!m_cLockRecursion++) m_ulOwningThread = GetCurrentThreadId();
#endif // _DEBUG
}
#ifdef _DEBUG
inline LONG CITCriticalSection::LockCount() { return (m_ulOwningThread == GetCurrentThreadId())? m_cLockRecursion : 0; } #endif // _DEBUG
inline void CITCriticalSection::Leave() { #ifdef _DEBUG
RonM_ASSERT(m_cLockRecursion > 0);
if (!--m_cLockRecursion) m_ulOwningThread = ~0; #endif // _DEBUG
::LeaveCriticalSection(&m_cs); }
class CSyncWith { public:
CSyncWith(CITCriticalSection &refcs); ~CSyncWith(); private:
CITCriticalSection *m_pcs;
#ifdef _DEBUG
LONG m_cLocksPrevious; #endif // _DEBUG
};
inline CSyncWith::CSyncWith(CITCriticalSection &refcs) { m_pcs = &refcs;
#ifdef _DEBUG
m_cLocksPrevious = m_pcs->LockCount(); #endif // _DEBUG
m_pcs->Enter(); }
inline CSyncWith::~CSyncWith() { m_pcs->Leave();
#ifdef _DEBUG
LONG cLocks = m_pcs->LockCount();
RonM_ASSERT(cLocks == m_cLocksPrevious); #endif // _DEBUG
}
#ifdef _DEBUG
inline BOOL IsUnlocked(CITCriticalSection &refcs) { return refcs.LockCount() == 0; }
#endif // _DEBUG;
#endif // __SYNC_H__
|