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()