Subj : Win32 condition variables & MySQL To : comp.programming.threads From : d|dq Date : Tue Aug 09 2005 07:52 pm To my surprise, today, I realized MySQL uses the following technique: /* Implementation of posix conditions */ typedef struct st_pthread_link { DWORD thread_id; struct st_pthread_link *next; } pthread_link; typedef struct { uint32 waiting; #ifdef OS2 HEV semaphore; #else HANDLE semaphore; #endif } pthread_cond_t; #ifndef OS2 struct timespec { /* For pthread_cond_timedwait() */ time_t tv_sec; long tv_nsec; }; #endif int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr) { cond->waiting=0; cond->semaphore=CreateSemaphore(NULL,0,0x7FFFFFFF,NullS); if (!cond->semaphore) return ENOMEM; return 0; } int pthread_cond_destroy(pthread_cond_t *cond) { return CloseHandle(cond->semaphore) ? 0 : EINVAL; } int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) { InterlockedIncrement(&cond->waiting); LeaveCriticalSection(mutex); WaitForSingleObject(cond->semaphore,INFINITE); InterlockedDecrement(&cond->waiting); EnterCriticalSection(mutex); return 0 ; } int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, struct timespec *abstime) { struct _timeb curtime; int result; long timeout; _ftime(&curtime); timeout= ((long) (abstime->tv_sec - curtime.time)*1000L + (long)((abstime->tv_nsec/1000) - curtime.millitm)/1000L); if (timeout < 0) /* Some safety */ timeout = 0L; InterlockedIncrement(&cond->waiting); LeaveCriticalSection(mutex); result=WaitForSingleObject(cond->semaphore,timeout); InterlockedDecrement(&cond->waiting); EnterCriticalSection(mutex); return result == WAIT_TIMEOUT ? ETIMEDOUT : 0; } int pthread_cond_signal(pthread_cond_t *cond) { long prev_count; if (cond->waiting) ReleaseSemaphore(cond->semaphore,1,&prev_count); return 0; } int pthread_cond_broadcast(pthread_cond_t *cond) { long prev_count; if (cond->waiting) ReleaseSemaphore(cond->semaphore,cond->waiting,&prev_count); return 0 ; } .