/*
* Lock Table
* This table contains a pointer to the critical section management structure
* for each lock.
*
* Locks marked lkPrealloc have their critical sections statically allocated
* and initialized at startup in _mtinitlocks. Locks marked lkNormal must
* be allocated when first used, via a call to _mtinitlocknum.
*/
static struct {
PCRITICAL_SECTION lock;
enum { lkNormal = 0, lkPrealloc, lkDeleted } kind;
} _locktable[_TOTAL_LOCKS] = {
{ NULL, lkPrealloc }, /* 0 == _SIGNAL_LOCK */
{ NULL, lkPrealloc }, /* 1 == _IOB_SCAN_LOCK */
{ NULL, lkNormal }, /* 2 == _TMPNAM_LOCK - not preallocated */
{ NULL, lkPrealloc }, /* 3 == _CONIO_LOCK */
{ NULL, lkPrealloc }, /* 4 == _HEAP_LOCK */
{ NULL, lkNormal }, /* 5 == _UNDNAME_LOCK - not preallocated */
{ NULL, lkPrealloc }, /* 6 == _TIME_LOCK */
{ NULL, lkPrealloc }, /* 7 == _ENV_LOCK */
{ NULL, lkPrealloc }, /* 8 == _EXIT_LOCK1 */
{ NULL, lkNormal }, /* 9 == _POPEN_LOCK - not preallocated */
{ NULL, lkPrealloc }, /* 10 == _LOCKTAB_LOCK */
{ NULL, lkNormal }, /* 11 == _OSFHND_LOCK - not preallocated */
{ NULL, lkPrealloc }, /* 12 == _SETLOCALE_LOCK */
{ NULL, lkPrealloc }, /* 13 == _MB_CP_LOCK */
{ NULL, lkPrealloc }, /* 14 == _TYPEINFO_LOCK */
#ifdef _DEBUG
{ NULL, lkPrealloc }, /* 15 == _DEBUG_LOCK */
#else /* _DEBUG */
{ NULL, lkNormal }, /* 15 == _DEBUG_LOCK */
#endif /* _DEBUG */
{ NULL, lkPrealloc }, /* 16 == _STREAM_LOCKS+0 - stdin */
{ NULL, lkPrealloc }, /* 17 == _STREAM_LOCKS+1 - stdout */
{ NULL, lkPrealloc }, /* 18 == _STREAM_LOCKS+2 - stderr */
/* { NULL, lkNormal }, /* ... */
};
反正就是定义了这么18个关于CRITICAL_SECTION的结构体。lkPrealloc意思就是初始化的时候要把相应的CRITICAL_SECTION也进行初始化。lkNormal类型的第一次使用的时候才会进行初始化。
int __cdecl _mtinitlocks (
void
)
{
int locknum;
int idxPrealloc = 0;
/*
* Scan _locktable[] and allocate all entries marked lkPrealloc.
*/
for ( locknum = 0 ; locknum < _TOTAL_LOCKS ; locknum++ ) {
if ( _locktable[locknum].kind == lkPrealloc ) {
_locktable[locknum].lock = &lclcritsects[idxPrealloc++];
if ( !InitializeCriticalSectionAndSpinCount( _locktable[locknum].lock,
_CRT_SPINCOUNT ))
{
_locktable[locknum].lock = NULL;
return FALSE;
}
}
}
return TRUE;
}
上面这个函数,无非就是要是CRITICAL_SECTION未初始化,就初始化,否则EnterCriticalSection一下下。
void __cdecl _unlock (
int locknum
)
{
/*
* leave the critical section.
*/
LeaveCriticalSection( _locktable[locknum].lock );
}
这里就是LeaveCriticalSection一下下。