diff options
Diffstat (limited to 'linuxthreads/semaphore.c')
-rw-r--r-- | linuxthreads/semaphore.c | 72 |
1 files changed, 45 insertions, 27 deletions
diff --git a/linuxthreads/semaphore.c b/linuxthreads/semaphore.c index eca68d2f77..175302188e 100644 --- a/linuxthreads/semaphore.c +++ b/linuxthreads/semaphore.c @@ -32,9 +32,9 @@ int sem_init(sem_t *sem, int pshared, unsigned int value) errno = ENOSYS; return -1; } - __pthread_init_lock((struct _pthread_fastlock *) &sem->sem_lock); - sem->sem_value = value; - sem->sem_waiting = NULL; + __pthread_init_lock((struct _pthread_fastlock *) &sem->__sem_lock); + sem->__sem_value = value; + sem->__sem_waiting = NULL; return 0; } @@ -42,23 +42,23 @@ int sem_wait(sem_t * sem) { volatile pthread_descr self = thread_self(); - __pthread_lock((struct _pthread_fastlock *) &sem->sem_lock, self); - if (sem->sem_value > 0) { - sem->sem_value--; - __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock); + __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, self); + if (sem->__sem_value > 0) { + sem->__sem_value--; + __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); return 0; } - enqueue(&sem->sem_waiting, self); + enqueue(&sem->__sem_waiting, self); /* Wait for sem_post or cancellation */ - __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock); + __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); suspend_with_cancellation(self); /* This is a cancellation point */ if (THREAD_GETMEM(self, p_canceled) && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) { /* Remove ourselves from the waiting list if we're still on it */ - __pthread_lock((struct _pthread_fastlock *) &sem->sem_lock, self); - remove_from_queue(&sem->sem_waiting, self); - __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock); + __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, self); + remove_from_queue(&sem->__sem_waiting, self); + __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); pthread_exit(PTHREAD_CANCELED); } /* We got the semaphore */ @@ -69,15 +69,15 @@ int sem_trywait(sem_t * sem) { int retval; - __pthread_lock((struct _pthread_fastlock *) &sem->sem_lock, NULL); - if (sem->sem_value == 0) { + __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, NULL); + if (sem->__sem_value == 0) { errno = EAGAIN; retval = -1; } else { - sem->sem_value--; + sem->__sem_value--; retval = 0; } - __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock); + __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); return retval; } @@ -88,19 +88,19 @@ int sem_post(sem_t * sem) struct pthread_request request; if (THREAD_GETMEM(self, p_in_sighandler) == NULL) { - __pthread_lock((struct _pthread_fastlock *) &sem->sem_lock, self); - if (sem->sem_waiting == NULL) { - if (sem->sem_value >= SEM_VALUE_MAX) { + __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, self); + if (sem->__sem_waiting == NULL) { + if (sem->__sem_value >= SEM_VALUE_MAX) { /* Overflow */ errno = ERANGE; - __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock); + __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); return -1; } - sem->sem_value++; - __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock); + sem->__sem_value++; + __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); } else { - th = dequeue(&sem->sem_waiting); - __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock); + th = dequeue(&sem->__sem_waiting); + __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); restart(th); } } else { @@ -122,15 +122,33 @@ int sem_post(sem_t * sem) int sem_getvalue(sem_t * sem, int * sval) { - *sval = sem->sem_value; + *sval = sem->__sem_value; return 0; } int sem_destroy(sem_t * sem) { - if (sem->sem_waiting != NULL) { - errno = EBUSY; + if (sem->__sem_waiting != NULL) { + __set_errno (EBUSY); return -1; } return 0; } + +sem_t *sem_open(const char *name, int oflag, ...) +{ + __set_errno (ENOSYS); + return SEM_FAILED; +} + +int sem_close(sem_t *sem) +{ + __set_errno (ENOSYS); + return -1; +} + +int sem_unlink(const char *name) +{ + __set_errno (ENOSYS); + return -1; +} |