windows-nt/Source/XPSP1/NT/base/crts/crtw32/stdcpp/xlock.cpp

53 lines
1 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
// xlock.cpp -- global lock for locales, etc.
#include <stdlib.h>
#include <yvals.h>
#if _MULTI_THREAD
#include "xmtx.h"
_STD_BEGIN
#define MAX_LOCK 4 /* must be power of two */
static _Rmtx mtx[MAX_LOCK];
static long init = -1;
_Init_locks::_Init_locks()
{ // initialize locks
if (InterlockedIncrement(&init) == 0)
for (int count = 0; count < MAX_LOCK; ++count)
_Mtxinit(&mtx[count]);
}
_Init_locks::~_Init_locks()
{ // clean up locks
if (InterlockedDecrement(&init) < 0)
for (int count = 0; count < MAX_LOCK; ++count)
_Mtxdst(&mtx[count]);
}
static _Init_locks initlocks;
_Lockit::_Lockit()
: _Locktype(0)
{ // lock default mutex
_Mtxlock(&mtx[0]);
}
_Lockit::_Lockit(int kind)
: _Locktype(kind & (MAX_LOCK - 1))
{ // lock the mutex
_Mtxlock(&mtx[_Locktype]);
}
_Lockit::~_Lockit()
{ // unlock the mutex
_Mtxunlock(&mtx[_Locktype]);
}
_STD_END
#endif // _MULTI_THREAD
/*
* Copyright (c) 1992-2001 by P.J. Plauger. ALL RIGHTS RESERVED.
* Consult your license regarding permissions and restrictions.
V3.10:0009 */