19 #if defined(MYTHREAD_POSIX) || defined(MYTHREAD_WIN95) \
20 || defined(MYTHREAD_VISTA)
21 # define MYTHREAD_ENABLED 1
25 #ifdef MYTHREAD_ENABLED
51 #define mythread_sync(mutex) mythread_sync_helper1(mutex, __LINE__)
52 #define mythread_sync_helper1(mutex, line) mythread_sync_helper2(mutex, line)
53 #define mythread_sync_helper2(mutex, line) \
54 for (unsigned int mythread_i_ ## line = 0; \
56 ? (mythread_mutex_unlock(&(mutex)), 0) \
57 : (mythread_mutex_lock(&(mutex)), 1); \
58 mythread_i_ ## line = 1) \
59 for (unsigned int mythread_j_ ## line = 0; \
60 !mythread_j_ ## line; \
61 mythread_j_ ## line = 1)
65 #if !defined(MYTHREAD_ENABLED)
72 #define mythread_once(func) \
74 static bool once_ = false; \
82 #if !(defined(_WIN32) && !defined(__CYGWIN__))
90 int ret = sigprocmask(how, set, oset);
97 #elif defined(MYTHREAD_POSIX)
103 #include <sys/time.h>
109 #define MYTHREAD_RET_TYPE void *
110 #define MYTHREAD_RET_VALUE NULL
112 typedef pthread_t mythread;
113 typedef pthread_mutex_t mythread_mutex;
117 #ifdef HAVE_CLOCK_GETTIME
124 typedef struct timespec mythread_condtime;
128 #define mythread_once(func) \
130 static pthread_once_t once_ = PTHREAD_ONCE_INIT; \
131 pthread_once(&once_, &func); \
146 int ret = pthread_sigmask(how, set, oset);
156 mythread_create(mythread *thread,
void *(*func)(
void *
arg),
void *
arg)
163 const int ret = pthread_create(thread,
NULL, func,
arg);
171 mythread_join(mythread thread)
173 return pthread_join(thread,
NULL);
179 mythread_mutex_init(mythread_mutex *
mutex)
185 mythread_mutex_destroy(mythread_mutex *
mutex)
187 int ret = pthread_mutex_destroy(
mutex);
193 mythread_mutex_lock(mythread_mutex *
mutex)
195 int ret = pthread_mutex_lock(
mutex);
201 mythread_mutex_unlock(mythread_mutex *
mutex)
203 int ret = pthread_mutex_unlock(
mutex);
219 mythread_cond_init(mythread_cond *mycond)
221 #ifdef HAVE_CLOCK_GETTIME
223 # if defined(HAVE_PTHREAD_CONDATTR_SETCLOCK) && HAVE_DECL_CLOCK_MONOTONIC
225 pthread_condattr_t condattr;
230 if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0
231 && pthread_condattr_init(&condattr) == 0) {
232 int ret = pthread_condattr_setclock(
233 &condattr, CLOCK_MONOTONIC);
235 ret = pthread_cond_init(&mycond->cond, &condattr);
237 pthread_condattr_destroy(&condattr);
240 mycond->clk_id = CLOCK_MONOTONIC;
250 mycond->clk_id = CLOCK_REALTIME;
253 return pthread_cond_init(&mycond->cond,
NULL);
257 mythread_cond_destroy(mythread_cond *
cond)
259 int ret = pthread_cond_destroy(&
cond->cond);
265 mythread_cond_signal(mythread_cond *
cond)
267 int ret = pthread_cond_signal(&
cond->cond);
273 mythread_cond_wait(mythread_cond *
cond, mythread_mutex *
mutex)
275 int ret = pthread_cond_wait(&
cond->cond,
mutex);
283 mythread_cond_timedwait(mythread_cond *
cond, mythread_mutex *
mutex,
284 const mythread_condtime *condtime)
286 int ret = pthread_cond_timedwait(&
cond->cond,
mutex, condtime);
294 mythread_condtime_set(mythread_condtime *condtime,
const mythread_cond *
cond,
297 condtime->tv_sec = timeout_ms / 1000;
298 condtime->tv_nsec = (timeout_ms % 1000) * 1000000;
300 #ifdef HAVE_CLOCK_GETTIME
302 int ret = clock_gettime(
cond->clk_id, &now);
306 condtime->tv_sec += now.tv_sec;
307 condtime->tv_nsec += now.tv_nsec;
314 condtime->tv_sec += now.tv_sec;
315 condtime->tv_nsec += now.tv_usec * 1000L;
319 if (condtime->tv_nsec >= 1000000000L) {
320 condtime->tv_nsec -= 1000000000L;
326 #elif defined(MYTHREAD_WIN95) || defined(MYTHREAD_VISTA)
332 #define WIN32_LEAN_AND_MEAN
333 #ifdef MYTHREAD_VISTA
335 # define _WIN32_WINNT 0x0600
340 #define MYTHREAD_RET_TYPE unsigned int __stdcall
341 #define MYTHREAD_RET_VALUE 0
344 typedef CRITICAL_SECTION mythread_mutex;
346 #ifdef MYTHREAD_WIN95
347 typedef HANDLE mythread_cond;
366 #ifdef MYTHREAD_VISTA
367 #define mythread_once(func) \
369 static INIT_ONCE once_ = INIT_ONCE_STATIC_INIT; \
371 if (!InitOnceBeginInitialize(&once_, 0, &pending_, NULL)) \
375 if (!InitOnceComplete(&once, 0, NULL)) \
386 mythread_create(mythread *thread,
387 unsigned int (__stdcall *func)(
void *
arg),
void *
arg)
398 mythread_join(mythread thread)
402 if (WaitForSingleObject(thread, INFINITE) != WAIT_OBJECT_0)
405 if (!CloseHandle(thread))
413 mythread_mutex_init(mythread_mutex *
mutex)
415 InitializeCriticalSection(
mutex);
420 mythread_mutex_destroy(mythread_mutex *
mutex)
422 DeleteCriticalSection(
mutex);
426 mythread_mutex_lock(mythread_mutex *
mutex)
428 EnterCriticalSection(
mutex);
432 mythread_mutex_unlock(mythread_mutex *
mutex)
434 LeaveCriticalSection(
mutex);
439 mythread_cond_init(mythread_cond *
cond)
441 #ifdef MYTHREAD_WIN95
445 InitializeConditionVariable(
cond);
451 mythread_cond_destroy(mythread_cond *
cond)
453 #ifdef MYTHREAD_WIN95
461 mythread_cond_signal(mythread_cond *
cond)
463 #ifdef MYTHREAD_WIN95
466 WakeConditionVariable(
cond);
471 mythread_cond_wait(mythread_cond *
cond, mythread_mutex *
mutex)
473 #ifdef MYTHREAD_WIN95
474 LeaveCriticalSection(
mutex);
475 WaitForSingleObject(*
cond, INFINITE);
476 EnterCriticalSection(
mutex);
478 BOOL ret = SleepConditionVariableCS(
cond,
mutex, INFINITE);
485 mythread_cond_timedwait(mythread_cond *
cond, mythread_mutex *
mutex,
486 const mythread_condtime *condtime)
488 #ifdef MYTHREAD_WIN95
489 LeaveCriticalSection(
mutex);
492 DWORD elapsed = GetTickCount() - condtime->start;
494 ? 0 : condtime->timeout - elapsed;
496 #ifdef MYTHREAD_WIN95
498 assert(ret == WAIT_OBJECT_0 || ret == WAIT_TIMEOUT);
500 EnterCriticalSection(
mutex);
502 return ret == WAIT_TIMEOUT;
505 assert(ret || GetLastError() == ERROR_TIMEOUT);
511 mythread_condtime_set(mythread_condtime *condtime,
const mythread_cond *
cond,
515 condtime->start = GetTickCount();
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg static fd static protocol static who struct sockaddr static addrlen static backlog struct timeval struct timezone static tz const struct iovec static count static mode const void const struct sockaddr static tolen const char static pathname void static offset struct stat static buf void long static basep static whence static length const void static len static semflg const void static shmflg const struct timespec struct timespec static rem const char static group const void start
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg static fd static protocol static who struct sockaddr static addrlen static backlog gettimeofday
assert(limit<=UINT32_MAX/2)
static void mythread_sigmask(int how, const sigset_t *restrict set, sigset_t *restrict oset)
#define cond(bop, top, mask, flags)
_W64 unsigned int uintptr_t
Common includes, definitions, system-specific things etc.