aboutsummaryrefslogtreecommitdiff
path: root/src/libthread
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-01-11 21:28:00 +0000
committerrsc <devnull@localhost>2005-01-11 21:28:00 +0000
commit37cc72d323478b1d98ee741e3d88557d141e7767 (patch)
tree41906698bec7e235fc39b6a145a3d1335b66a2f2 /src/libthread
parente9dbe11dbf43197892680f3b5084cd12b6dc198b (diff)
downloadplan9port-37cc72d323478b1d98ee741e3d88557d141e7767.tar.gz
plan9port-37cc72d323478b1d98ee741e3d88557d141e7767.tar.bz2
plan9port-37cc72d323478b1d98ee741e3d88557d141e7767.zip
paranoia
Diffstat (limited to 'src/libthread')
-rw-r--r--src/libthread/daemonize.c10
-rw-r--r--src/libthread/thread.c9
2 files changed, 17 insertions, 2 deletions
diff --git a/src/libthread/daemonize.c b/src/libthread/daemonize.c
index 8f4d5eee..c6e00d19 100644
--- a/src/libthread/daemonize.c
+++ b/src/libthread/daemonize.c
@@ -38,7 +38,15 @@ child(void)
raise(WTERMSIG(status));
_exit(98); /* not reached */
}
- fprint(2, "%s: wait pid %d status 0x%ux\n", pid, status);
+ if(WIFSTOPPED(status)){
+ fprint(2, "%s: wait pid %d stopped\n", argv0, pid);
+ return;
+ }
+ if(WIFCONTINUED(status)){
+ fprint(2, "%s: wait pid %d continued\n", argv0, pid);
+ return;
+ }
+ fprint(2, "%s: wait pid %d status 0x%ux\n", argv0, pid, status);
_exit(99);
}
diff --git a/src/libthread/thread.c b/src/libthread/thread.c
index 550cc056..2b6d1e37 100644
--- a/src/libthread/thread.c
+++ b/src/libthread/thread.c
@@ -112,12 +112,19 @@ threadalloc(void (*fn)(void*), void *arg, uint stack)
sigprocmask(SIG_BLOCK, &zero, &t->context.uc.uc_sigmask);
/* must initialize with current context */
- getcontext(&t->context.uc);
+ if(getcontext(&t->context.uc) < 0)
+ sysfatal("threadalloc getcontext: %r");
/* call makecontext to do the real work. */
/* leave a few words open on both ends */
t->context.uc.uc_stack.ss_sp = t->stk+8;
t->context.uc.uc_stack.ss_size = t->stksize-64;
+#ifdef __sun__ /* sigh */
+ /* can avoid this with __MAKECONTEXT_V2_SOURCE but only on SunOS 5.9 */
+ t->context.uc_stack.ss_sp =
+ (char*)t->context.uc_stack.ss_sp
+ +t->context.uc_stack.ss_size;
+#endif
makecontext(&t->context.uc, (void(*)())threadstart, 1, t);
return t;