mirror of
git://sourceware.org/git/glibc.git
synced 2025-02-17 13:00:43 +08:00
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.
This commit is contained in:
parent
5fca066768
commit
80ec4993cc
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user