tparanoia - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
commit 37cc72d323478b1d98ee741e3d88557d141e7767
parent e9dbe11dbf43197892680f3b5084cd12b6dc198b
Author: rsc 
Date:   Tue, 11 Jan 2005 21:28:00 +0000

paranoia

Diffstat:
  M src/libthread/daemonize.c           |      10 +++++++++-
  M src/libthread/thread.c              |       9 ++++++++-

2 files changed, 17 insertions(+), 2 deletions(-)
---
diff --git a/src/libthread/daemonize.c b/src/libthread/daemonize.c
t@@ -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
t@@ -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;