nostrdb: windows: fix threading bugs

Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
William Casarin
2024-11-22 21:32:43 -08:00
committed by Daniel D’Aquino
parent 3186b0e1d3
commit 02df1e209b
2 changed files with 53 additions and 21 deletions

View File

@@ -5,27 +5,47 @@
#include <windows.h>
#define ErrCode() GetLastError()
#define pthread_t HANDLE
#define pthread_mutex_t HANDLE
#define pthread_cond_t HANDLE
#define pthread_cond_destroy(x)
#define pthread_mutex_unlock(x) ReleaseMutex(*x)
#define pthread_mutex_destroy(x) \
(CloseHandle(*x) ? 0 : ErrCode())
#define pthread_mutex_lock(x) WaitForSingleObject(*x, INFINITE)
#define pthread_mutex_init(mutex, attr) \
((*mutex = CreateMutex(NULL, FALSE, NULL)) ? 0 : ErrCode())
#define pthread_cond_init(x, attr) (InitializeConditionVariable(x), 0)
#define pthread_cond_signal(x) SetEvent(*x)
#define pthread_cond_wait(cond,mutex) do{SignalObjectAndWait(*mutex, *cond, INFINITE, FALSE); WaitForSingleObject(*mutex, INFINITE);}while(0)
#define THREAD_CREATE(thr,start,arg) \
(((thr) = CreateThread(NULL, 0, start, arg, 0, NULL)) ? 0 : ErrCode())
#define THREAD_FINISH(thr) \
(WaitForSingleObject(thr, INFINITE) ? ErrCode() : 0)
#define THREAD_TERMINATE(thr) \
(TerminateThread(thr, 0) ? ErrCode() : 0)
#define LOCK_MUTEX(mutex) WaitForSingleObject(mutex, INFINITE)
#define UNLOCK_MUTEX(mutex) ReleaseMutex(mutex)
// Define POSIX-like thread types
typedef HANDLE pthread_t;
typedef CRITICAL_SECTION pthread_mutex_t;
typedef CONDITION_VARIABLE pthread_cond_t;
#define ErrCode() GetLastError()
// Mutex functions
#define pthread_mutex_init(mutex, attr) \
(InitializeCriticalSection(mutex), 0)
#define pthread_mutex_destroy(mutex) \
(DeleteCriticalSection(mutex), 0)
#define pthread_mutex_lock(mutex) \
(EnterCriticalSection(mutex), 0)
#define pthread_mutex_unlock(mutex) \
(LeaveCriticalSection(mutex), 0)
// Condition variable functions
#define pthread_cond_init(cond, attr) \
(InitializeConditionVariable(cond), 0)
#define pthread_cond_destroy(cond)
#define pthread_cond_signal(cond) \
(WakeConditionVariable(cond), 0)
#define pthread_cond_wait(cond, mutex) \
(SleepConditionVariableCS(cond, mutex, INFINITE) ? 0 : ErrCode())
// Thread functions
#define THREAD_CREATE(thr, start, arg) \
(((thr = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start, arg, 0, NULL)) != NULL) ? 0 : ErrCode())
#define THREAD_FINISH(thr) \
(WaitForSingleObject(thr, INFINITE), CloseHandle(thr), 0)
#define THREAD_TERMINATE(thr) \
(TerminateThread(thr, 0) ? ErrCode() : 0)
#else // _WIN32
#include <pthread.h>