00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "libgomp.h"
00034
00035 #ifdef HAVE_BROKEN_POSIX_SEMAPHORES
00036 #include <stdlib.h>
00037
00038 void gomp_sem_init (gomp_sem_t *sem, int value)
00039 {
00040 int ret;
00041
00042 ret = pthread_mutex_init (&sem->mutex, NULL);
00043 if (ret)
00044 return;
00045
00046 ret = pthread_cond_init (&sem->cond, NULL);
00047 if (ret)
00048 return;
00049
00050 sem->value = value;
00051 }
00052
00053 void gomp_sem_wait (gomp_sem_t *sem)
00054 {
00055 int ret;
00056
00057 ret = pthread_mutex_lock (&sem->mutex);
00058 if (ret)
00059 return;
00060
00061 if (sem->value > 0)
00062 {
00063 sem->value--;
00064 ret = pthread_mutex_unlock (&sem->mutex);
00065 return;
00066 }
00067
00068 while (sem->value <= 0)
00069 {
00070 ret = pthread_cond_wait (&sem->cond, &sem->mutex);
00071 if (ret)
00072 {
00073 pthread_mutex_unlock (&sem->mutex);
00074 return;
00075 }
00076 }
00077
00078 sem->value--;
00079 ret = pthread_mutex_unlock (&sem->mutex);
00080 return;
00081 }
00082
00083 void gomp_sem_post (gomp_sem_t *sem)
00084 {
00085 int ret;
00086
00087 ret = pthread_mutex_lock (&sem->mutex);
00088 if (ret)
00089 return;
00090
00091 sem->value++;
00092
00093 ret = pthread_mutex_unlock (&sem->mutex);
00094 if (ret)
00095 return;
00096
00097 ret = pthread_cond_signal (&sem->cond);
00098
00099 return;
00100 }
00101
00102 void gomp_sem_destroy (gomp_sem_t *sem)
00103 {
00104 int ret;
00105
00106 ret = pthread_mutex_destroy (&sem->mutex);
00107 if (ret)
00108 return;
00109
00110 ret = pthread_cond_destroy (&sem->cond);
00111
00112 return;
00113 }
00114 #else
00115 void
00116 gomp_sem_wait (gomp_sem_t *sem)
00117 {
00118
00119
00120 while (sem_wait (sem) != 0)
00121 continue;
00122 }
00123 #endif