//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1998 - 1999 // // File: mutex.hxx // //-------------------------------------------------------------------------- class MUTEX { public: MUTEX( DWORD * pStatus ) { *pStatus = RtlInitializeCriticalSection(&c); } ~MUTEX() { RtlDeleteCriticalSection(&c); } void Enter() { RtlEnterCriticalSection(&c); } void Leave() { RtlLeaveCriticalSection(&c); } private: RTL_CRITICAL_SECTION c; }; class CLAIM_MUTEX { public: CLAIM_MUTEX( MUTEX & Mutex ) : Lock( Mutex ) { Taken = 0; Enter(); } void Enter() { Lock.Enter(); ++Taken; } void Leave() { ASSERT( Taken > 0 ); Lock.Leave(); --Taken; } ~CLAIM_MUTEX() { ASSERT( Taken >= 0 ); while (Taken > 0) { Leave(); } } private: signed Taken; MUTEX & Lock; };