Leaked source code of windows server 2003
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.
 
 
 
 
 
 

308 lines
6.9 KiB

// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (c) 1992-2001 Microsoft Corporation, All Rights Reserved
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#ifndef __PROVMT_H__
#define __PROVMT_H__
#ifdef UNICODE
#define LPCTSTR wchar_t *
#else
#define LPCTSTR char *
#endif
class CSyncObject;
class CSemaphore;
class CMutex;
class CEvent;
class CCriticalSection;
class CSingleLock;
class CMultiLock;
/////////////////////////////////////////////////////////////////////////////
// Basic synchronization object
class CSyncObject
{
public:
CSyncObject(LPCTSTR pstrName);
// Attributes
public:
operator HANDLE() const;
HANDLE m_hObject;
// Operations
virtual BOOL Lock(DWORD dwTimeout = INFINITE);
virtual BOOL Unlock() = 0;
virtual BOOL Unlock(LONG /* lCount */, LPLONG /* lpPrevCount=NULL */)
{ return TRUE; }
// Implementation
public:
virtual ~CSyncObject();
friend class CSingleLock;
friend class CMultiLock;
};
/////////////////////////////////////////////////////////////////////////////
// CSemaphore
class CSemaphore : public CSyncObject
{
// Constructor
public:
CSemaphore(LONG lInitialCount = 1, LONG lMaxCount = 1,
LPCTSTR pstrName=NULL, LPSECURITY_ATTRIBUTES lpsaAttributes = NULL);
// Implementation
public:
virtual ~CSemaphore();
virtual BOOL Unlock();
virtual BOOL Unlock(LONG lCount, LPLONG lprevCount = NULL);
};
/////////////////////////////////////////////////////////////////////////////
// CMutex
class CMutex : public CSyncObject
{
// Constructor
public:
CMutex(BOOL bInitiallyOwn = FALSE, LPCTSTR lpszName = NULL,
LPSECURITY_ATTRIBUTES lpsaAttribute = NULL);
// Implementation
public:
virtual ~CMutex();
BOOL Unlock();
};
/////////////////////////////////////////////////////////////////////////////
// CEvent
class CEvent : public CSyncObject
{
// Constructor
public:
CEvent(BOOL bInitiallyOwn = FALSE, BOOL bManualReset = FALSE,
LPCTSTR lpszNAme = NULL, LPSECURITY_ATTRIBUTES lpsaAttribute = NULL);
// Operations
public:
BOOL SetEvent();
BOOL PulseEvent();
BOOL ResetEvent();
BOOL Unlock();
// Implementation
public:
virtual ~CEvent();
};
/////////////////////////////////////////////////////////////////////////////
// CCriticalSection
class CCriticalSection : public CSyncObject
{
// Constructor
public:
CCriticalSection();
// Attributes
public:
operator CRITICAL_SECTION*();
CRITICAL_SECTION m_sect;
// Operations
public:
BOOL Unlock();
BOOL Lock();
BOOL Lock(DWORD dwTimeout);
// Implementation
public:
virtual ~CCriticalSection();
};
/////////////////////////////////////////////////////////////////////////////
// CCriticalSection
class CStaticCriticalSection : public CSyncObject
{
static bool failureSet;
static void RecordFailure(){ failureSet = true;}
bool validCS;
// Constructor
public:
CStaticCriticalSection();
// Attributes
public:
operator CRITICAL_SECTION*();
CRITICAL_SECTION m_sect;
// Operations
public:
static bool AnyFailure() { return failureSet;}
BOOL Unlock();
BOOL Lock();
BOOL Lock(DWORD dwTimeout);
// Implementation
public:
virtual ~CStaticCriticalSection();
};
/////////////////////////////////////////////////////////////////////////////
// CSingleLock
class CSingleLock
{
// Constructors
public:
CSingleLock(CSyncObject* pObject, BOOL bInitialLock = FALSE);
// Operations
public:
BOOL Lock(DWORD dwTimeOut = INFINITE);
BOOL Unlock();
BOOL Unlock(LONG lCount, LPLONG lPrevCount = NULL);
BOOL IsLocked();
// Implementation
public:
~CSingleLock();
protected:
CSyncObject* m_pObject;
HANDLE m_hObject;
BOOL m_bAcquired;
};
/////////////////////////////////////////////////////////////////////////////
// CMultiLock
class CMultiLock
{
// Constructor
public:
CMultiLock(CSyncObject* ppObjects[], DWORD dwCount, BOOL bInitialLock = FALSE);
// Operations
public:
DWORD Lock(DWORD dwTimeOut = INFINITE, BOOL bWaitForAll = TRUE,
DWORD dwWakeMask = 0);
BOOL Unlock();
BOOL Unlock(LONG lCount, LPLONG lPrevCount = NULL);
BOOL IsLocked(DWORD dwItem);
// Implementation
public:
~CMultiLock();
protected:
HANDLE m_hPreallocated[8];
BOOL m_bPreallocated[8];
CSyncObject* const * m_ppObjectArray;
HANDLE* m_pHandleArray;
BOOL* m_bLockedArray;
DWORD m_dwCount;
};
/////////////////////////////////////////////////////////////////////////////
// Inline function declarations
inline CSyncObject::operator HANDLE() const
{ return m_hObject;}
inline BOOL CSemaphore::Unlock()
{ return Unlock(1, NULL); }
inline BOOL CEvent::SetEvent()
{ return ::SetEvent(m_hObject); }
inline BOOL CEvent::PulseEvent()
{ return ::PulseEvent(m_hObject); }
inline BOOL CEvent::ResetEvent()
{ return ::ResetEvent(m_hObject); }
inline CSingleLock::~CSingleLock()
{ Unlock(); }
inline BOOL CSingleLock::IsLocked()
{ return m_bAcquired; }
inline BOOL CMultiLock::IsLocked(DWORD dwObject)
{ return m_bLockedArray[dwObject]; }
inline CCriticalSection::CCriticalSection() : CSyncObject(NULL)
{
if (!::InitializeCriticalSectionAndSpinCount(&m_sect,0))
{
throw Heap_Exception(Heap_Exception::HEAP_ERROR::E_ALLOCATION_ERROR) ;
}
}
inline CCriticalSection::operator CRITICAL_SECTION*()
{ return (CRITICAL_SECTION*) &m_sect; }
inline CCriticalSection::~CCriticalSection()
{ ::DeleteCriticalSection(&m_sect); }
inline BOOL CCriticalSection::Lock()
{ ::EnterCriticalSection(&m_sect); return TRUE; }
inline BOOL CCriticalSection::Lock(DWORD /* dwTimeout */)
{ return Lock(); }
inline BOOL CCriticalSection::Unlock()
{ ::LeaveCriticalSection(&m_sect); return TRUE; }
inline CStaticCriticalSection::CStaticCriticalSection() : CSyncObject(NULL)
{
if (::InitializeCriticalSectionAndSpinCount(&m_sect,0))
{
validCS = true;
}
else
{
validCS = false;
RecordFailure();
}
}
inline CStaticCriticalSection::~CStaticCriticalSection()
{ if (validCS) ::DeleteCriticalSection(&m_sect); }
inline CStaticCriticalSection::operator CRITICAL_SECTION*()
{ return (CRITICAL_SECTION*) &m_sect; }
inline BOOL CStaticCriticalSection::Lock()
{
if (validCS)
{
::EnterCriticalSection(&m_sect); return TRUE;
}
else
return FALSE;
}
inline BOOL CStaticCriticalSection::Lock(DWORD /* dwTimeout */)
{ return Lock(); }
inline BOOL CStaticCriticalSection::Unlock()
{
if (validCS)
{
::LeaveCriticalSection(&m_sect); return TRUE;
}
else
return FALSE;
}
#endif // __AFXMT_H__
/////////////////////////////////////////////////////////////////////////////