256 lines
5.1 KiB
C++
256 lines
5.1 KiB
C++
// 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__
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|