linuxthreads bug in 2.2.4 under ppc linux
Kevin B. Hendricks
kevin.hendricks@sympatico.ca
Fri Dec 7 22:31:00 GMT 2001
Hi,
Looking at __pthread_alt_lock()
Why don't we eve initialize the wait_node.thr field to anything at all
(not even NULL) if the oldstatus was zero? This seems a bit dangerous to
leave in an unitialized state. Shouldn't it be set to 0?
Also are there any known issues with thread_self() to incorrectly
returning 0 if a thread was just recently started?
#if defined HAS_COMPARE_AND_SWAP
do {
oldstatus = lock->__status;
if (oldstatus == 0) {
newstatus = 1;
} else {
if (self == NULL)
self = thread_self();
wait_node.thr = self;
newstatus = (long) &wait_node;
}
wait_node.abandoned = 0;
wait_node.next = (struct wait_node *) oldstatus;
/* Make sure the store in wait_node.next completes before performing
the compare-and-swap */
MEMORY_BARRIER();
} while(! __compare_and_swap(&lock->__status, oldstatus, newstatus));
/* Suspend. Note that unlike in __pthread_lock, we don't worry
here about spurious wakeup. That's because this lock is not
used in situations where that can happen; the restart can
only come from the previous lock owner. */
if (oldstatus != 0)
suspend(self);
READ_MEMORY_BARRIER();
#endif
}
Kevin
More information about the Libc-alpha
mailing list