libc_r/uthread/uthread_join.c

Marc Olzheim marcolz at stack.nl
Mon Mar 7 16:14:55 PST 2005


I mailed this to FreeBSD a long time ago. I saw it wasn't fixed in DFly,
but I'm not sure whether libc_r is still used in DFly as I'm new to
it... Anyway, just for the fun of it:

Hi.

Is there a reason why in the case that a thread is not done yet,
pthread_join() does not call _thread_kern_sig_undefer() ?

We have a program where one thread consumes all CPU it can get for
blocks of data.
A status thread is spawned as soon as the main thread starts working on
a new block, printing an 'x % done' message and sleeping for a second in
a loop. When the block is processed, the status thread is
pthread_cancel()d and the main thread does a pthread_join() to wait for
the status thread to exit. Now, when the second block is to be
processed, a new status thread is spawned, but since signals are still
defered and the main thread needs all the cpu it can get, it doesn't get
scheduled in anymore.

The following fixed the problem in 4-STABLE and it seems to work ok, but
I'm no sure if there was a reason for the omission of the call in that
case...

Index: /usr/src/lib/libc_r/uthread/uthread_join.c
--- /usr/src/lib/libc_r/uthread/uthread_join.c	Tue Oct 22 16:44:03 2002
+++ /usr/src/lib/libc_r/uthread/uthread_join.c	Wed Dec 31 12:12:33 2003
@@ -137,6 +137,9 @@
 		ret = curthread->join_status.error;
 		if ((ret == 0) && (thread_return != NULL))
 			*thread_return = curthread->join_status.ret;
+
+		/* Undefer and handle pending signals, yielding if necessary: */
+		_thread_kern_sig_undefer();
 	} else {
 		/*
 		 * The thread exited (is dead) without being detached, and no



And another one, for terminating a backtrace (i386 only) while threaded:


Index: /usr/src/lib/libc_r/uthread/pthread_private.h
--- /usr/src/lib/libc_r/uthread/pthread_private.h	Tue Oct 22 16:44:02 2002
+++ /usr/src/lib/libc_r/uthread/pthread_private.h	Fri Apr 23 13:49:26 2004
@@ -80,7 +80,10 @@
 	fdata = (char *) (ucp)->uc_mcontext.mc_fpregs;	\
 	__asm__("frstor %0": :"m"(*fdata));		\
 } while (0)
-#define SET_RETURN_ADDR_JB(jb, ra)	(jb)[0]._jb[0] = (int)(ra)
+#define SET_RETURN_ADDR_JB(jb, ra)	do {		\
+	(jb)[0]._jb[0] = (int)(ra);			\
+	(jb)[0]._jb[3] = 0;				\
+} while (0)
 #elif	defined(__alpha__)
 #include <machine/reg.h>
 #define	GET_STACK_JB(jb)	((unsigned long)((jb)[0]._jb[R_SP + 4]))


Zlo
Attachment:
pgp00002.pgp
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pgp00002.pgp
Type: application/octet-stream
Size: 187 bytes
Desc: "Description: PGP signature"
URL: <http://lists.dragonflybsd.org/pipermail/submit/attachments/20050307/6baa6960/attachment-0018.obj>


More information about the Submit mailing list