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-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
wait_node.abandoned = 0;
wait_node.next = (struct wait_node *) lock->__status;
wait_node.thr = self;
+ lock->__status = (long) &wait_node;
suspend_needed = 1;
}
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
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