home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
vc98
/
mfc
/
src
/
afxcrit.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-16
|
4KB
|
140 lines
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 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.
#include "stdafx.h"
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#pragma warning(disable: 4706) // assignment within conditional
/////////////////////////////////////////////////////////////////////////////
// global thread protection
#ifdef _MT
AFX_STATIC_DATA BOOL _afxCriticalInit = 0; // set _afxGlobalLock, _afxTempLock init
AFX_STATIC_DATA BOOL _afxCriticalWin32s = 0;
// _afxResourceLock and _afxLockInit are used to lock each MFC global resource
AFX_STATIC_DATA CRITICAL_SECTION _afxResourceLock[CRIT_MAX] = { { 0 } };
AFX_STATIC_DATA CRITICAL_SECTION _afxLockInitLock = { 0 };
AFX_STATIC_DATA BOOL _afxLockInit[CRIT_MAX] = { 0 };
#ifdef _DEBUG
AFX_STATIC_DATA BOOL _afxResourceLocked[CRIT_MAX] = { 0 };
#endif
BOOL AFXAPI AfxCriticalInit()
{
// Note: this must be initialized with only one thread running
if (!_afxCriticalInit)
{
// now we are about to be initialized
VERIFY(++_afxCriticalInit);
// determine if running on Win32s (under Windows 3.x)
DWORD dwVersion = GetVersion();
_afxCriticalWin32s = ((BYTE)dwVersion) < 4 && (dwVersion & 0x80000000);
// only initialize MT related stuff if on MT capable systems
if (!_afxCriticalWin32s)
InitializeCriticalSection(&_afxLockInitLock);
}
return _afxCriticalInit;
}
void AFXAPI AfxCriticalTerm()
{
if (_afxCriticalInit)
{
VERIFY(!--_afxCriticalInit);
if (!_afxCriticalWin32s)
{
// delete helper critical sections
DeleteCriticalSection(&_afxLockInitLock);
// delete specific resource critical sections
for (int i = 0; i < CRIT_MAX; i++)
{
#ifdef _DEBUG
ASSERT(!_afxResourceLocked[i]);
#endif
if (_afxLockInit[i])
{
DeleteCriticalSection(&_afxResourceLock[i]);
VERIFY(!--_afxLockInit[i]);
}
}
}
}
}
void AFXAPI AfxLockGlobals(int nLockType)
{
ASSERT((UINT)nLockType < CRIT_MAX);
// intialize global state, if necessary
if (!_afxCriticalInit)
{
AfxCriticalInit();
ASSERT(_afxCriticalInit);
}
// nothing necessary on Win32s (no multiple threads)
if (_afxCriticalWin32s)
return;
// initialize specific resource if necessary
if (!_afxLockInit[nLockType])
{
EnterCriticalSection(&_afxLockInitLock);
if (!_afxLockInit[nLockType])
{
InitializeCriticalSection(&_afxResourceLock[nLockType]);
VERIFY(++_afxLockInit[nLockType]);
}
LeaveCriticalSection(&_afxLockInitLock);
}
// lock specific resource
EnterCriticalSection(&_afxResourceLock[nLockType]);
#ifdef _DEBUG
ASSERT(++_afxResourceLocked[nLockType] > 0);
#endif
}
void AFXAPI AfxUnlockGlobals(int nLockType)
{
ASSERT(_afxCriticalInit);
ASSERT((UINT)nLockType < CRIT_MAX);
// nothing necessary on Win32s (no multiple threads)
if (_afxCriticalWin32s)
return;
// unlock specific resource
ASSERT(_afxLockInit[nLockType]);
#ifdef _DEBUG
ASSERT(--_afxResourceLocked[nLockType] >= 0);
#endif
LeaveCriticalSection(&_afxResourceLock[nLockType]);
}
#endif
/////////////////////////////////////////////////////////////////////////////