windows-nt/Source/XPSP1/NT/base/crts/crtw32/stdcpp/xmtx.c
2020-09-26 16:20:57 +08:00

52 lines
1 KiB
C

/* xmtx.c -- mutex support for VC++ */
#include "xmtx.h"
#if !_MULTI_THREAD
#else /* !_MULTI_THREAD */
/* Win32 critical sections are recursive, but
Win32 does not have once-function */
void _Once(_Once_t *_Cntrl, void (*_Func)(void))
{ /* execute _Func exactly one time */
_Once_t old;
if (*_Cntrl == 2)
;
else if ((old = InterlockedExchange(_Cntrl, 1)) == 0)
{ /* execute _Func, mark as executed */
_Func();
*_Cntrl = 2;
}
else if (old == 2)
*_Cntrl = 2;
else
while (*_Cntrl != 2)
Sleep(1);
}
void _Mtxinit(_Rmtx *_Mtx)
{ /* initialize mutex */
InitializeCriticalSection(_Mtx);
}
void _Mtxdst(_Rmtx *_Mtx)
{ /* delete mutex */
DeleteCriticalSection(_Mtx);
}
void _Mtxlock(_Rmtx *_Mtx)
{ /* lock mutex */
EnterCriticalSection(_Mtx);
}
void _Mtxunlock(_Rmtx *_Mtx)
{ /* unlock mutex */
LeaveCriticalSection(_Mtx);
}
#endif /* !_MULTI_THREAD */
/*
* Copyright (c) 1992-2001 by P.J. Plauger. ALL RIGHTS RESERVED.
* Consult your license regarding permissions and restrictions.
V3.10:0009 */