📄 afxcrit.cpp
字号:
// 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
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -