// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1995 Microsoft Corporation
// 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 __AFXMT_H__
#define __AFXMT_H__
#ifdef _MAC
#error Multithreaded classes not supported in this library variant.
#endif
#ifndef __AFX_H__
#include <afx.h>
#endif
#ifdef _AFX_MINREBUILD
#pragma component(minrebuild, off)
#endif
#ifndef _AFX_FULLTYPEINFO
#pragma component(mintypeinfo, on)
#endif
#ifdef _AFX_PACKING
#pragma pack(push, _AFX_PACKING)
#endif
/////////////////////////////////////////////////////////////////////////////
// AFXMT - MFC Multithreaded Extensions (Syncronization Objects)
// Classes declared in this file
//CObject
class CSyncObject;
class CSemaphore;
class CMutex;
class CEvent;
class CCriticalSection;
class CSingleLock;
class CMultiLock;
#undef AFX_DATA
#define AFX_DATA AFX_CORE_DATA
/////////////////////////////////////////////////////////////////////////////
// Basic synchronization object
class CSyncObject : public CObject
{
DECLARE_DYNAMIC(CSyncObject)
// Constructor
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();
#ifdef _DEBUG
CString m_strName;
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
friend class CSingleLock;
friend class CMultiLock;
};
/////////////////////////////////////////////////////////////////////////////
// CSemaphore
class CSemaphore : public CSyncObject
{
DECLARE_DYNAMIC(CSemaphore)
// 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
{
DECLARE_DYNAMIC(CMutex)
// Constructor
public:
CMutex(BOOL bInitiallyOwn = FALSE, LPCTSTR lpszName = NULL,
LPSECURITY_ATTRIBUTES lpsaAttribute = NULL);
// Implementation
public:
virtual ~CMutex();
BOOL Unlock();
};
/////////////////////////////////////////////////////////////////////////////
// CEvent
class CEvent : public CSyncObject
{
DECLARE_DYNAMIC(CEvent)
// 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
{
DECLARE_DYNAMIC(CCriticalSection)
// 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();
};
/////////////////////////////////////////////////////////////////////////////
// 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
#ifdef _AFX_PACKING
#pragma pack(pop)
#endif
#ifdef _AFX_ENABLE_INLINES
#define _AFXMT_INLINE inline
#include <afxmt.inl>
#undef _AFXMT_INLINE
#endif
#undef AFX_DATA
#define AFX_DATA
#ifdef _AFX_MINREBUILD
#pragma component(minrebuild, on)
#endif
#ifndef _AFX_FULLTYPEINFO
#pragma component(mintypeinfo, off)
#endif
#endif // __AFXMT_H__
/////////////////////////////////////////////////////////////////////////////