47 volatile unsigned long head, tail;
49 pthread_mutex_t mutex;
58 int ret_code, end_code= STAT_ERROR;
64 CHECK_DO(fair_lock!= NULL,
goto end);
67 ret_code= pthread_mutex_init(&fair_lock->mutex, NULL);
69 ret_code= pthread_cond_init(&fair_lock->cond, NULL);
72 end_code= STAT_SUCCESS;
74 if(end_code!= STAT_SUCCESS)
75 fair_lock_close(&fair_lock);
83 if(ref_fair_lock== NULL)
86 if((fair_lock= *ref_fair_lock)!= NULL) {
87 pthread_mutex_destroy(&fair_lock->mutex);
88 pthread_cond_destroy(&fair_lock->cond);
97 #ifndef USE_PTHREAD_MUTEX_ONLY 105 #ifndef USE_PTHREAD_MUTEX_ONLY 106 pthread_mutex_lock(&fair_lock->mutex);
107 queue= fair_lock->tail++;
108 while(queue!= fair_lock->head)
109 pthread_cond_wait(&fair_lock->cond, &fair_lock->mutex);
110 pthread_mutex_unlock(&fair_lock->mutex);
112 pthread_mutex_lock(&fair_lock->mutex);
123 #ifndef USE_PTHREAD_MUTEX_ONLY 124 pthread_mutex_lock(&fair_lock->mutex);
126 pthread_cond_broadcast(&fair_lock->cond);
127 pthread_mutex_unlock(&fair_lock->mutex);
129 pthread_mutex_unlock(&fair_lock->mutex);
General status codes enumeration.
#define CHECK_DO(COND, ACTION)