Files
damus/nostrdb/src/thread.h
William Casarin 02df1e209b nostrdb: windows: fix threading bugs
Signed-off-by: William Casarin <jb55@jb55.com>
2025-08-11 16:40:00 -07:00

64 lines
1.7 KiB
C

#ifndef NDB_THREAD_H
#define NDB_THREAD_H
#ifdef _WIN32
#include <windows.h>
#define ErrCode() GetLastError()
// 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>
//#define ErrCode() errno
#define THREAD_CREATE(thr,start,arg) pthread_create(&thr,NULL,start,arg)
#define THREAD_FINISH(thr) pthread_join(thr,NULL)
#define THREAD_TERMINATE(thr) pthread_exit(&thr)
#define LOCK_MUTEX(mutex) pthread_mutex_lock(mutex)
#define UNLOCK_MUTEX(mutex) pthread_mutex_unlock(mutex)
#endif
#endif // NDB_THREAD_H