| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- // 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
- /////////////////////////////////////////////////////////////////////////////
|