Annotation of OpenXM_contrib2/asir2000/gc/include/private/darwin_semaphore.h, Revision 1.1
1.1 ! noro 1: #ifndef GC_DARWIN_SEMAPHORE_H
! 2: #define GC_DARWIN_SEMAPHORE_H
! 3:
! 4: #if !defined(GC_DARWIN_THREADS)
! 5: #error darwin_semaphore.h included with GC_DARWIN_THREADS not defined
! 6: #endif
! 7:
! 8: /*
! 9: This is a very simple semaphore implementation for darwin. It
! 10: is implemented in terms of pthreads calls so it isn't async signal
! 11: safe. This isn't a problem because signals aren't used to
! 12: suspend threads on darwin.
! 13: */
! 14:
! 15: typedef struct {
! 16: pthread_mutex_t mutex;
! 17: pthread_cond_t cond;
! 18: int value;
! 19: } sem_t;
! 20:
! 21: static int sem_init(sem_t *sem, int pshared, int value) {
! 22: int ret;
! 23: if(pshared)
! 24: GC_abort("sem_init with pshared set");
! 25: sem->value = value;
! 26:
! 27: ret = pthread_mutex_init(&sem->mutex,NULL);
! 28: if(ret < 0) return -1;
! 29: ret = pthread_cond_init(&sem->cond,NULL);
! 30: if(ret < 0) return -1;
! 31: return 0;
! 32: }
! 33:
! 34: static int sem_post(sem_t *sem) {
! 35: if(pthread_mutex_lock(&sem->mutex) < 0)
! 36: return -1;
! 37: sem->value++;
! 38: if(pthread_cond_signal(&sem->cond) < 0) {
! 39: pthread_mutex_unlock(&sem->mutex);
! 40: return -1;
! 41: }
! 42: if(pthread_mutex_unlock(&sem->mutex) < 0)
! 43: return -1;
! 44: return 0;
! 45: }
! 46:
! 47: static int sem_wait(sem_t *sem) {
! 48: if(pthread_mutex_lock(&sem->mutex) < 0)
! 49: return -1;
! 50: while(sem->value == 0) {
! 51: pthread_cond_wait(&sem->cond,&sem->mutex);
! 52: }
! 53: sem->value--;
! 54: if(pthread_mutex_unlock(&sem->mutex) < 0)
! 55: return -1;
! 56: return 0;
! 57: }
! 58:
! 59: static int sem_destroy(sem_t *sem) {
! 60: int ret;
! 61: ret = pthread_cond_destroy(&sem->cond);
! 62: if(ret < 0) return -1;
! 63: ret = pthread_mutex_destroy(&sem->mutex);
! 64: if(ret < 0) return -1;
! 65: return 0;
! 66: }
! 67:
! 68: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>