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); }