52 lines
1 KiB
C
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 */
|