summaryrefslogtreecommitdiff
path: root/libpthread/linuxthreads/oldsemaphore.c
diff options
context:
space:
mode:
Diffstat (limited to 'libpthread/linuxthreads/oldsemaphore.c')
-rw-r--r--libpthread/linuxthreads/oldsemaphore.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/libpthread/linuxthreads/oldsemaphore.c b/libpthread/linuxthreads/oldsemaphore.c
index ecf7d7019..3a3b3d186 100644
--- a/libpthread/linuxthreads/oldsemaphore.c
+++ b/libpthread/linuxthreads/oldsemaphore.c
@@ -32,6 +32,9 @@ typedef struct {
int sem_spinlock;
} old_sem_t;
+/* Maximum value the semaphore can have. */
+#define SEM_VALUE_MAX ((int) ((~0u) >> 1))
+
static inline int sem_compare_and_swap(old_sem_t *sem, long oldval, long newval)
{
return compare_and_swap(&sem->sem_status, oldval, newval, &sem->sem_spinlock);
@@ -60,7 +63,7 @@ int __old_sem_init(old_sem_t *sem, int pshared, unsigned int value)
errno = ENOSYS;
return -1;
}
- sem->sem_spinlock = __LT_SPINLOCK_INIT;
+ sem->sem_spinlock = 0;
sem->sem_status = ((long)value << 1) + 1;
return 0;
}
@@ -87,7 +90,7 @@ int __old_sem_wait(old_sem_t * sem)
while (1) {
/* Register extrication interface */
- __pthread_set_own_extricate_if(self, &extr);
+ __pthread_set_own_extricate_if(self, &extr);
do {
oldstatus = sem->sem_status;
if ((oldstatus & 1) && (oldstatus != 1))
@@ -100,13 +103,12 @@ int __old_sem_wait(old_sem_t * sem)
while (! sem_compare_and_swap(sem, oldstatus, newstatus));
if (newstatus & 1) {
/* We got the semaphore. */
- __pthread_set_own_extricate_if(self, 0);
- self->p_nextwaiting = NULL;
+ __pthread_set_own_extricate_if(self, 0);
return 0;
}
/* Wait for sem_post or cancellation */
suspend(self);
- __pthread_set_own_extricate_if(self, 0);
+ __pthread_set_own_extricate_if(self, 0);
/* This is a cancellation point */
if (self->p_canceled && self->p_cancelstate == PTHREAD_CANCEL_ENABLE) {