mirror of
https://github.com/ZDoom/Raze.git
synced 2024-11-16 17:32:13 +00:00
718112a8fe
Currently none of these is being used, but eventually they will, once more code gets ported over. So it's better to have them right away and avoid editing the project file too much, only to revert that later.
95 lines
2.6 KiB
C
95 lines
2.6 KiB
C
/* Threads.c -- multithreading library
|
|
2017-06-26 : Igor Pavlov : Public domain */
|
|
|
|
#include "Precomp.h"
|
|
|
|
#ifndef UNDER_CE
|
|
#include <process.h>
|
|
#endif
|
|
|
|
#include "Threads.h"
|
|
|
|
static WRes GetError()
|
|
{
|
|
DWORD res = GetLastError();
|
|
return res ? (WRes)res : 1;
|
|
}
|
|
|
|
static WRes HandleToWRes(HANDLE h) { return (h != NULL) ? 0 : GetError(); }
|
|
static WRes BOOLToWRes(BOOL v) { return v ? 0 : GetError(); }
|
|
|
|
WRes HandlePtr_Close(HANDLE *p)
|
|
{
|
|
if (*p != NULL)
|
|
{
|
|
if (!CloseHandle(*p))
|
|
return GetError();
|
|
*p = NULL;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
WRes Handle_WaitObject(HANDLE h) { return (WRes)WaitForSingleObject(h, INFINITE); }
|
|
|
|
WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param)
|
|
{
|
|
/* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */
|
|
|
|
#ifdef UNDER_CE
|
|
|
|
DWORD threadId;
|
|
*p = CreateThread(0, 0, func, param, 0, &threadId);
|
|
|
|
#else
|
|
|
|
unsigned threadId;
|
|
*p = (HANDLE)_beginthreadex(NULL, 0, func, param, 0, &threadId);
|
|
|
|
#endif
|
|
|
|
/* maybe we must use errno here, but probably GetLastError() is also OK. */
|
|
return HandleToWRes(*p);
|
|
}
|
|
|
|
static WRes Event_Create(CEvent *p, BOOL manualReset, int signaled)
|
|
{
|
|
*p = CreateEvent(NULL, manualReset, (signaled ? TRUE : FALSE), NULL);
|
|
return HandleToWRes(*p);
|
|
}
|
|
|
|
WRes Event_Set(CEvent *p) { return BOOLToWRes(SetEvent(*p)); }
|
|
WRes Event_Reset(CEvent *p) { return BOOLToWRes(ResetEvent(*p)); }
|
|
|
|
WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled) { return Event_Create(p, TRUE, signaled); }
|
|
WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled) { return Event_Create(p, FALSE, signaled); }
|
|
WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p) { return ManualResetEvent_Create(p, 0); }
|
|
WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p) { return AutoResetEvent_Create(p, 0); }
|
|
|
|
|
|
WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount)
|
|
{
|
|
*p = CreateSemaphore(NULL, (LONG)initCount, (LONG)maxCount, NULL);
|
|
return HandleToWRes(*p);
|
|
}
|
|
|
|
static WRes Semaphore_Release(CSemaphore *p, LONG releaseCount, LONG *previousCount)
|
|
{ return BOOLToWRes(ReleaseSemaphore(*p, releaseCount, previousCount)); }
|
|
WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num)
|
|
{ return Semaphore_Release(p, (LONG)num, NULL); }
|
|
WRes Semaphore_Release1(CSemaphore *p) { return Semaphore_ReleaseN(p, 1); }
|
|
|
|
WRes CriticalSection_Init(CCriticalSection *p)
|
|
{
|
|
/* InitializeCriticalSection can raise only STATUS_NO_MEMORY exception */
|
|
#ifdef _MSC_VER
|
|
__try
|
|
#endif
|
|
{
|
|
InitializeCriticalSection(p);
|
|
/* InitializeCriticalSectionAndSpinCount(p, 0); */
|
|
}
|
|
#ifdef _MSC_VER
|
|
__except (EXCEPTION_EXECUTE_HANDLER) { return 1; }
|
|
#endif
|
|
return 0;
|
|
}
|