X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=platform%2Fwin32%2Ffunctions%2Fthreads%2Fmtx_unlock.c;fp=platform%2Fwin32%2Ffunctions%2Fthreads%2Fmtx_unlock.c;h=27b7aefadb7d6ff4a277c1e6fedadb27bca74e9d;hb=639bad513ab9399ed9a8c588a476a10dbe6c9478;hp=0000000000000000000000000000000000000000;hpb=008908f7a61acf9df1248c005378a3c4b4393547;p=pdclib diff --git a/platform/win32/functions/threads/mtx_unlock.c b/platform/win32/functions/threads/mtx_unlock.c new file mode 100644 index 0000000..27b7aef --- /dev/null +++ b/platform/win32/functions/threads/mtx_unlock.c @@ -0,0 +1,39 @@ +#ifndef REGTEST +#include +#include + +extern void _PDCLIB_w32errno( void ); +int mtx_unlock(mtx_t *mtx) +{ + if(mtx->_NestCount) { + mtx->_NestCount--; + return thrd_success; + } + + mtx->_ThreadId = 0; + + DWORD res = InterlockedDecrement(&mtx->_State); + if(res == (DWORD) -1) { + // We reset the state to -1; success! + return thrd_success; + } + + DWORD rv = SetEvent(mtx->_WaitEvHandle); + if(rv == 0) { + _PDCLIB_w32errno(); + return thrd_error; + } + + return thrd_success; +} +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + return TEST_RESULTS; +} + +#endif \ No newline at end of file