30typedef CRITICAL_SECTION pthread_mutex_t;
31typedef CONDITION_VARIABLE pthread_cond_t;
32typedef HANDLE pthread_t;
34#define pthread_mutex_init(m, a) InitializeCriticalSection(m)
35#define pthread_mutex_destroy(m) DeleteCriticalSection(m)
36#define pthread_mutex_lock(m) EnterCriticalSection(m)
37#define pthread_mutex_unlock(m) LeaveCriticalSection(m)
39#define pthread_cond_init(c, a) InitializeConditionVariable(c)
40#define pthread_cond_destroy(c) (void)(0)
41#define pthread_cond_wait(c, m) SleepConditionVariableCS(c, m, INFINITE)
42#define pthread_cond_signal(c) WakeConditionVariable(c)
43#define pthread_cond_broadcast(c) WakeAllConditionVariable(c)
55} zxc_win_thread_arg_t;
65static inline unsigned __stdcall zxc_win_thread_entry(
void* p) {
66 zxc_win_thread_arg_t* a = (zxc_win_thread_arg_t*)p;
67 void* (*f)(
void*) = a->func;
84static inline int pthread_create(pthread_t* thread,
const void* attr,
void* (*start_routine)(
void*),
87 zxc_win_thread_arg_t* wrapper =
ZXC_MALLOC(
sizeof(zxc_win_thread_arg_t));
89 wrapper->func = start_routine;
91 uintptr_t handle = _beginthreadex(NULL, 0, zxc_win_thread_entry, wrapper, 0, NULL);
92 if (UNLIKELY(handle == 0)) {
96 *thread = (HANDLE)handle;
108static inline int pthread_join(pthread_t thread,
void** retval) {
110 WaitForSingleObject(thread, INFINITE);
122 return (
int)si.dwNumberOfProcessors;
136 const long n = sysconf(_SC_NPROCESSORS_ONLN);
137 return (n > 0) ? (int)n : 1;
@ ZXC_ERROR_MEMORY
Memory allocation failure.
#define ZXC_MALLOC(size)
Heap allocator.
#define ZXC_ALWAYS_INLINE
Forces a function to be inlined (fallback for non-GCC/Clang/MSVC compilers).
#define ZXC_FREE(ptr)
Heap deallocator.
Internal definitions, constants, SIMD helpers, and utility functions.
static int zxc_num_procs(void)
Returns the number of online logical processors.