This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
Re:linuxthreads bug in 2.2.4 under ppc linux
- From: Kevin B. Hendricks <kevin dot hendricks at sympatico dot ca>
- To: libc-alpha at sources dot redhat dot com
- Cc: Franz Sirl <Franz dot Sirl-kernel at lauterbach dot com>,Franz Sirl <Franz dot Sirl-ppc at lauterbach dot com>
- Date: Fri, 7 Dec 2001 23:11:55 -0500
- Subject: Re:linuxthreads bug in 2.2.4 under ppc linux
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