summaryrefslogtreecommitdiff
path: root/linuxthreads/spinlock.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-07-19 18:58:05 +0000
committerUlrich Drepper <drepper@redhat.com>2000-07-19 18:58:05 +0000
commit80ec4993cc416058f6f8e98ce32bd729e9be1150 (patch)
tree1319ef9e116827875e9ccf2aefa10974303c8bd1 /linuxthreads/spinlock.c
parent5fca066768291ffbdaffa9d055c3e9055c5998ad (diff)
downloadglibc-80ec4993cc416058f6f8e98ce32bd729e9be1150.tar.gz
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.
Diffstat (limited to 'linuxthreads/spinlock.c')
-rw-r--r--linuxthreads/spinlock.c6
1 files changed, 4 insertions, 2 deletions
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