home *** CD-ROM | disk | FTP | other *** search
- // 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
-
- /////////////////////////////////////////////////////////////////////////////
-