diff options
author | Ulrich Drepper <drepper@redhat.com> | 2000-07-19 18:58:05 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2000-07-19 18:58:05 +0000 |
commit | 80ec4993cc416058f6f8e98ce32bd729e9be1150 (patch) | |
tree | 1319ef9e116827875e9ccf2aefa10974303c8bd1 | |
parent | 5fca066768291ffbdaffa9d055c3e9055c5998ad (diff) | |
download | glibc-80ec4993cc416058f6f8e98ce32bd729e9be1150.tar glibc-80ec4993cc416058f6f8e98ce32bd729e9be1150.tar.gz glibc-80ec4993cc416058f6f8e98ce32bd729e9be1150.tar.bz2 glibc-80ec4993cc416058f6f8e98ce32bd729e9be1150.zip |
Update.
2000-07-19 Kaz Kylheku <kaz@ashi.footprints.net>
Bugfixes to the variant of the code for machines with no compare
and swap.
* spinlock.c (__pthread_alt_lock, __pthread_alt_timedlock): Wait
node was not being properly enqueued, due to failing to update
the lock->__status field.
* spinlock.c (__pthread_alt_timedlock): The oldstatus variable was
being set inappropriately, causing the suspend function to be called
with a null self pointer and crash.
-rw-r--r-- | linuxthreads/ChangeLog | 13 | ||||
-rw-r--r-- | linuxthreads/spinlock.c | 6 |
2 files changed, 17 insertions, 2 deletions
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index f14cf0d4a5..92328f923f 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,16 @@ +2000-07-19 Kaz Kylheku <kaz@ashi.footprints.net> + + Bugfixes to the variant of the code for machines with no compare + and swap. + + * spinlock.c (__pthread_alt_lock, __pthread_alt_timedlock): Wait + node was not being properly enqueued, due to failing to update + the lock->__status field. + + * spinlock.c (__pthread_alt_timedlock): The oldstatus variable was + being set inappropriately, causing the suspend function to be called + with a null self pointer and crash. + 2000-07-18 Ulrich Drepper <drepper@redhat.com> * spinlock.h (__pthread_alt_trylock): Fix code used if no diff --git a/linuxthreads/spinlock.c b/linuxthreads/spinlock.c index 6cd2679d98..102b1be5f7 100644 --- a/linuxthreads/spinlock.c +++ b/linuxthreads/spinlock.c @@ -389,6 +389,7 @@ void __pthread_alt_lock(struct _pthread_fastlock * lock, wait_node.abandoned = 0; wait_node.next = (struct wait_node *) lock->__status; wait_node.thr = self; + lock->__status = (long) &wait_node; suspend_needed = 1; } @@ -434,7 +435,7 @@ void __pthread_alt_lock(struct _pthread_fastlock * lock, int __pthread_alt_timedlock(struct _pthread_fastlock * lock, pthread_descr self, const struct timespec *abstime) { - long oldstatus; + long oldstatus = 0; #if defined HAS_COMPARE_AND_SWAP long newstatus; #endif @@ -462,11 +463,12 @@ int __pthread_alt_timedlock(struct _pthread_fastlock * lock, p_wait_node->abandoned = 0; p_wait_node->next = (struct wait_node *) lock->__status; p_wait_node->thr = self; + lock->__status = (long) p_wait_node; + oldstatus = 1; /* force suspend */ } WRITE_MEMORY_BARRIER(); lock->__spinlock = 0; - oldstatus = 1; /* force suspend */ goto suspend; } #endif |