26 #include "../windows/winpthreads.h" 37 #if defined (__WINDOWS__) 38 #define gettimeofday __gettimeofday 39 inline int __gettimeofday(
struct timeval *pcur_time,
struct timezone *tz)
41 if (pcur_time == NULL)
46 struct _timeb current;
48 pcur_time->tv_sec = (long) current.time;
49 pcur_time->tv_usec = current.millitm * 1000L;
52 tz->tz_minuteswest = current.timezone;
53 tz->tz_dsttime = current.dstflag;
61 #define thread_create(a, b, c) __thread_create(a, b, c) 62 inline bool __thread_create(thread_t* thread,
void* (*func)(
void*),
void* arg)
65 static bool _init =
false;
68 pthread_attr_init(&_attr);
69 pthread_attr_setdetachstate(&_attr, PTHREAD_CREATE_DETACHED);
72 return pthread_create(thread, &_attr, func, arg) == 0;
75 typedef pthread_mutex_t mutex_t;
77 #define mutex_init(a) __mutex_init(a) 78 inline bool __mutex_init(mutex_t* mutex)
80 static pthread_mutexattr_t _attr;
81 static bool _init =
false;
84 pthread_mutexattr_init(&_attr);
85 pthread_mutexattr_settype(&_attr, PTHREAD_MUTEX_RECURSIVE);
88 return pthread_mutex_init(mutex, &_attr) == 0;
91 #define mutex_lock(a) __mutex_lock(a) 92 inline bool __mutex_lock(mutex_t* mutex) {
return pthread_mutex_lock(mutex) == 0; }
94 #define mutex_trylock(a) __mutex_trylock(a) 95 inline bool __mutex_trylock(mutex_t* mutex) {
return pthread_mutex_trylock(mutex) == 0; }
97 #define mutex_unlock(a) __mutex_unlock(a) 98 inline void __mutex_unlock(mutex_t* mutex) { pthread_mutex_unlock(mutex); }
100 #define mutex_destroy(a) __mutex_destroy(a) 101 inline void __mutex_destroy(mutex_t* mutex) { pthread_mutex_destroy(mutex); }
103 typedef pthread_cond_t condition_t;
105 #define cond_init(a) __cond_init(a) 106 inline bool __cond_init(condition_t* cond) {
return pthread_cond_init(cond, NULL) == 0; }
108 #define cond_signal(a) __cond_signal(a) 109 inline void __cond_signal(condition_t* cond) { pthread_cond_signal(cond); }
111 #define cond_broadcast(a) __cond_broadcast(a) 112 inline void __cond_broadcast(condition_t* cond) { pthread_cond_broadcast(cond); }
114 #define cond_wait(a, b) __cond_wait(a, b) 115 inline bool __cond_wait(condition_t* cond, mutex_t* mutex) {
return pthread_cond_wait(cond, mutex) == 0; }
117 #define cond_timedwait(a, b, c) __cond_timedwait(a, b, c) 118 inline bool __cond_timedwait(condition_t* cond, mutex_t* mutex,
unsigned millisec)
121 return cond_wait(cond, mutex);
124 #if defined(__APPLE__) || defined(__WINDOWS__) 126 gettimeofday(&tv, NULL);
127 tv.tv_usec += (millisec % 1000) * 1000;
128 tv.tv_sec += millisec / 1000;
129 time.tv_sec = tv.tv_sec + tv.tv_usec / 1000000;
130 time.tv_nsec = (tv.tv_usec % 1000000) * 1000;
132 clock_gettime(CLOCK_REALTIME, &time);
133 time.tv_nsec += (millisec % 1000) * 1000000;
134 time.tv_sec += millisec / 1000 + time.tv_nsec / 1000000000;
135 time.tv_nsec %= 1000000000;
137 return (pthread_cond_timedwait(cond, mutex, &time) == 0);
140 #define cond_destroy(a) __cond_destroy(a) 141 inline void __cond_destroy(condition_t* cond) { pthread_cond_destroy(cond); }