plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

commit 37cc72d323478b1d98ee741e3d88557d141e7767
parent e9dbe11dbf43197892680f3b5084cd12b6dc198b
Author: rsc <devnull@localhost>
Date:   Tue, 11 Jan 2005 21:28:00 +0000

paranoia

Diffstat:
Msrc/libthread/daemonize.c | 10+++++++++-
Msrc/libthread/thread.c | 9++++++++-
2 files changed, 17 insertions(+), 2 deletions(-)

diff --git 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 @@ -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;