pthread_win_posix_condv_emul.hpp

00001 #line 432 "./lpsrc/flx_pthread.pak"
00002 #ifndef __FLX_PTHREAD_WIN_POSIX_CONDV_EMUL_H__
00003 #define __FLX_PTHREAD_WIN_POSIX_CONDV_EMUL_H__
00004 // Note: no namespaces here!
00005 // See http://www.cs.wustl.edu/~schmidt/win32-cv-1.html
00006 
00007 #include "flx_pthread_config.hpp"
00008 #if FLX_WIN32
00009 #include <windows.h>
00010 
00011 typedef HANDLE pthread_mutex_t;
00012 typedef void pthread_mutexattr_t; // do NOT use them!
00013 typedef void pthread_condattr_t; // do NOT use them!
00014 
00015 struct pthread_cond_t
00016 {
00017   int waiters_count_;
00018   // Number of waiting threads.
00019 
00020   CRITICAL_SECTION waiters_count_lock_;
00021   // Serialize access to <waiters_count_>.
00022 
00023   HANDLE sema_;
00024   // Semaphore used to queue up threads waiting for the condition to
00025   // become signaled.
00026 
00027   HANDLE waiters_done_;
00028   // An auto-reset event used by the broadcast/signal thread to wait
00029   // for all the waiting thread(s) to wake up and be released from the
00030   // semaphore.
00031 
00032   size_t was_broadcast_;
00033   // Keeps track of whether we were broadcasting or signaling.  This
00034   // allows us to optimize the code if we're just signaling.
00035 };
00036 
00037 // THIS IS SICK but there ain't no other way in C
00038 #define ETIMEDOUT WAIT_TIMEOUT
00039 // looks like EAGAIN is available in minggw, but not in vs sdk.
00040 #ifndef EAGAIN
00041 #define EAGAIN WAIT_TIMEOUT
00042 #endif
00043 
00044 int PTHREAD_EXTERN pthread_mutex_init (pthread_mutex_t*, const pthread_mutexattr_t*);
00045 int PTHREAD_EXTERN pthread_mutex_lock(pthread_mutex_t*);
00046 int PTHREAD_EXTERN pthread_mutex_unlock(pthread_mutex_t*);
00047 int PTHREAD_EXTERN pthread_mutex_destroy(pthread_mutex_t*);
00048 
00049 int PTHREAD_EXTERN pthread_cond_init (pthread_cond_t*, const pthread_condattr_t*);
00050 int PTHREAD_EXTERN pthread_cond_destroy(pthread_cond_t*);
00051 int PTHREAD_EXTERN pthread_cond_wait (pthread_cond_t*, pthread_mutex_t*);
00052 int PTHREAD_EXTERN pthread_cond_timedwait(pthread_cond_t*, pthread_mutex_t*, struct timespec const*);
00053 int PTHREAD_EXTERN pthread_cond_uswait(pthread_cond_t*, pthread_mutex_t*, unsigned long us);
00054 int PTHREAD_EXTERN pthread_cond_signal (pthread_cond_t*);
00055 int PTHREAD_EXTERN pthread_cond_broadcast (pthread_cond_t*);
00056 
00057 
00058 typedef HANDLE sem_t;
00059 
00060 int PTHREAD_EXTERN sem_init(sem_t *sem, int pshared, unsigned int value);
00061 int PTHREAD_EXTERN sem_wait(sem_t * sem);
00062 int PTHREAD_EXTERN sem_trywait(sem_t * sem);
00063 int PTHREAD_EXTERN sem_post(sem_t * sem);
00064 int PTHREAD_EXTERN sem_getvalue(sem_t * sem, int * sval);
00065 int PTHREAD_EXTERN sem_destroy(sem_t * sem);
00066 
00067 #else
00068 #include <errno.h>
00069 #include <pthread.h>
00070 #include <semaphore.h>
00071 // emulate the native Window functionality
00072 int PTHREAD_EXTERN pthread_cond_uswait( pthread_cond_t*, pthread_mutex_t*, unsigned long us);
00073 #endif
00074 #endif
00075 

Generated on Thu May 29 14:36:12 2008 for Felix by  doxygen 1.5.5