00001
00002
00003 #include <pthread.h>
00004
00005 typedef struct pseudosem_t {
00006 pthread_mutex_t mutex;
00007 pthread_cond_t cond;
00008 int val;
00009 } pseudosem_t;
00010
00011 inline void pseudosem_init(pseudosem_t *sem, int dummy, int _val)
00012 {
00013 sem->val = _val;
00014 pthread_mutex_init(&sem->mutex, NULL);
00015 pthread_cond_init(&sem->cond, NULL);
00016 }
00017
00018 inline void pseudosem_destroy(pseudosem_t *sem)
00019 {
00020 pthread_mutex_destroy(&sem->mutex);
00021 pthread_cond_destroy(&sem->cond);
00022 }
00023
00024 inline void pseudosem_wait(pseudosem_t *sem)
00025 {
00026 pthread_mutex_lock(&sem->mutex);
00027 if (!sem->val)
00028 {
00029
00030 pthread_cond_wait(&sem->cond, &sem->mutex);
00031
00032 }
00033 sem->val--;
00034 pthread_mutex_unlock(&sem->mutex);
00035 }
00036
00037 inline void pseudosem_post(pseudosem_t *sem)
00038 {
00039
00040 pthread_mutex_lock(&sem->mutex);
00041
00042 pthread_cond_signal(&sem->cond);
00043 sem->val++;
00044 pthread_mutex_unlock(&sem->mutex);
00045 }
00046
00047 #ifdef HAVE_SEMAPHORE_H
00048 #include <semaphore.h>
00049 #define pseudosem_t sem_t
00050 #define pseudosem_post sem_post
00051 #define pseudosem_wait sem_wait
00052 #define pseudosem_init sem_init
00053 #define pseudosem_destroy sem_destroy
00054 #endif