tdifferent fix for main proc bug - plan9port - [fork] Plan 9 from user space (HTM) git clone git://src.adamsgaard.dk/plan9port (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit 8ee6ad4d96bdb1f56cece8c11e75e5491ccc4020 (DIR) parent 8da6bca8074977c0fd1105ca4da2d5fb225b3ec4 (HTM) Author: rsc <devnull@localhost> Date: Mon, 14 Feb 2005 18:58:56 +0000 different fix for main proc bug Diffstat: M src/libthread/daemonize.c | 1 - M src/libthread/thread.c | 32 ++++++++++++++++++++----------- M src/libthread/threadimpl.h | 1 + 3 files changed, 22 insertions(+), 12 deletions(-) --- (DIR) diff --git a/src/libthread/daemonize.c b/src/libthread/daemonize.c t@@ -121,7 +121,6 @@ _threadsetupdaemonize(void) close(p[1]); break; case 0: - for(i=0; i<100; i++) sched_yield(); notedisable("sys: child"); signal(SIGCHLD, SIG_DFL); /* rfork(RFNOTEG); */ (DIR) diff --git a/src/libthread/thread.c b/src/libthread/thread.c t@@ -281,6 +281,24 @@ procscheduler(Proc *p) Out: _threaddebug("scheduler exit"); + if(p->mainproc){ + /* + * Stupid bug - on Linux 2.6 and maybe elsewhere, + * if the main thread exits then the others keep running + * but the process shows up as a zombie in ps and is not + * attachable with ptrace. We'll just sit around pretending + * to be a system proc instead of exiting. + */ + _threaddaemonize(); + lock(&threadnproclock); + if(++threadnsysproc == threadnproc) + threadexitsall(p->msg); + p->sysproc = 1; + unlock(&threadnproclock); + for(;;) + sleep(1000); + } + delproc(p); lock(&threadnproclock); if(p->sysproc) t@@ -298,7 +316,7 @@ _threadsetsysproc(void) { lock(&threadnproclock); if(++threadnsysproc == threadnproc) - exit(0); + threadexitsall(nil); unlock(&threadnproclock); proc()->sysproc = 1; } t@@ -576,21 +594,13 @@ main(int argc, char **argv) _pthreadinit(); p = procalloc(); + p->mainproc = 1; _threadsetproc(p); if(mainstacksize == 0) mainstacksize = 256*1024; _threadcreate(p, threadmainstart, nil, mainstacksize); procscheduler(p); - _threaddaemonize(); - /* - * On Linux 2.6, if the main thread exits then the others - * keep running but the process shows up as a zombie in ps - * and is not attachable with ptrace. We'll just sit around - * instead of exiting. - */ - for(;;) - sleep(1000); - _threadpexit(); + /* does not return */ return 0; } (DIR) diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h t@@ -108,6 +108,7 @@ struct Proc Context schedcontext; void *udata; Jmp sigjmp; + int mainproc; }; #define proc() _threadproc()