diff options
author | Mike Frysinger <vapier@gentoo.org> | 2005-11-15 03:02:51 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2005-11-15 03:02:51 +0000 |
commit | 5a69eba90b5b961ceb723d816ce8401582980477 (patch) | |
tree | 7d9cdbc2e9199c5f5dfc7ab34df0c89f18d38961 /libpthread/linuxthreads/oldsemaphore.c | |
parent | 87601389ad2fbd9e0655ae0a391bf7edfdb771c2 (diff) |
revert linuxthreads to pre rev 11377 (i.e. before the massive attempt to import glibc updates) while keeping the few bugfixes ... idea is to keep both old and new linuxthreads around so we can hack on the new version while delivering the old stable version to end users
Diffstat (limited to 'libpthread/linuxthreads/oldsemaphore.c')
-rw-r--r-- | libpthread/linuxthreads/oldsemaphore.c | 12 |
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) { |