tGet rid of 9proc. - 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 05d8c6df6c626f9e80e7d0ffe241c061bda36324
 (DIR) parent 040d1d02f5b829f59e63123d7095aea7d04e372b
 (HTM) Author: rsc <devnull@localhost>
       Date:   Thu, 23 Sep 2004 03:06:04 +0000
       
       Get rid of 9proc.
       
       Diffstat:
         D src/lib9/9proc.h                    |      23 -----------------------
         M src/lib9/_exits.c                   |       3 ---
         M src/lib9/lock-pthread.c             |       1 +
         M src/lib9/main.c                     |       2 --
         M src/lib9/mkfile                     |       3 ---
         M src/lib9/notify.c                   |      58 +++++++++++++++++++------------
         M src/lib9/post9p.c                   |       2 +-
         D src/lib9/rendez-futex.c             |     167 -------------------------------
         M src/lib9/rfork.c                    |       3 ---
       
       9 files changed, 38 insertions(+), 224 deletions(-)
       ---
 (DIR) diff --git a/src/lib9/9proc.h b/src/lib9/9proc.h
       t@@ -1,23 +0,0 @@
       -#ifndef _9PROC_H_
       -#define _9PROC_H_ 1
       -
       -enum
       -{
       -        NPRIV = 16,
       -        RENDHASH = 33,
       -};
       -
       -typedef struct Uproc Uproc;
       -struct Uproc
       -{
       -        int pid;
       -        int state;
       -        void *priv[NPRIV];
       -        p9jmp_buf notejb;
       -};
       -
       -extern Uproc *_p9uproc(int);
       -extern void _p9uprocdie(void);
       -extern void _clearuproc(void);
       -
       -#endif
 (DIR) diff --git a/src/lib9/_exits.c b/src/lib9/_exits.c
       t@@ -1,12 +1,9 @@
        #include <u.h>
        #include <libc.h>
       -#include "9proc.h"
        
        void
        _exits(char *s)
        {
       -        _p9uprocdie();
       -
                if(s && *s)
                        _exit(1);
                _exit(0);
 (DIR) diff --git a/src/lib9/lock-pthread.c b/src/lib9/lock-pthread.c
       t@@ -2,6 +2,7 @@
        #include <unistd.h>
        #include <sys/time.h>
        #include <sched.h>
       +#include <errno.h>
        #include <libc.h>
        
        static pthread_mutex_t initmutex = PTHREAD_MUTEX_INITIALIZER;
 (DIR) diff --git a/src/lib9/main.c b/src/lib9/main.c
       t@@ -1,14 +1,12 @@
        #include <u.h>
        #define NOPLAN9DEFINES
        #include <libc.h>
       -#include "9proc.h"
        
        extern void p9main(int, char**);
        
        int
        main(int argc, char **argv)
        {
       -        _p9uproc(0);
                p9main(argc, argv);
                exits("main");
                return 99;
 (DIR) diff --git a/src/lib9/mkfile b/src/lib9/mkfile
       t@@ -67,7 +67,6 @@ LIB9OFILES=\
                _exits.$O\
                _p9dialparse.$O\
                _p9dir.$O\
       -        _p9proc-$SYSNAME.$O\
                announce.$O\
                argv0.$O\
                atexit.$O\
       t@@ -99,8 +98,6 @@ LIB9OFILES=\
                errstr.$O\
                exec.$O\
                fcallfmt.$O\
       -        fork.$O\
       -        ffork-$SYSNAME.$O\
                get9root.$O\
                getcallerpc-$OBJTYPE.$O\
                getenv.$O\
 (DIR) diff --git a/src/lib9/notify.c b/src/lib9/notify.c
       t@@ -2,7 +2,6 @@
        #include <signal.h>
        #define NOPLAN9DEFINES
        #include <libc.h>
       -#include "9proc.h"
        
        extern char *_p9sigstr(int, char*);
        
       t@@ -41,6 +40,21 @@ static struct {
        #endif
        };
        
       +typedef struct Jmp Jmp;
       +struct Jmp
       +{
       +        p9jmp_buf b;
       +};
       +
       +static Jmp onejmp;
       +
       +static Jmp*
       +getonejmp(void)
       +{
       +        return &onejmp;
       +}
       +
       +Jmp *(*_notejmpbuf)(void) = getonejmp;
        static void (*notifyf)(void*, char*);
        
        static void
       t@@ -48,28 +62,35 @@ notifysigf(int sig)
        {
                int v;
                char tmp[64];
       -        Uproc *up;
       +        Jmp *j;
        
       -        up = _p9uproc(1);
       -        v = p9setjmp(up->notejb);
       +        j = (*_notejmpbuf)();
       +        v = p9setjmp(j->b);
                if(v == 0 && notifyf)
                        (*notifyf)(nil, _p9sigstr(sig, tmp));
                else if(v == 2){
       -if(0)print("HANDLED %d\n", sig);
       +                if(0)print("HANDLED %d\n", sig);
                        return;
                }
       -if(0)print("DEFAULT %d\n", sig);
       +        if(0)print("DEFAULT %d\n", sig);
                signal(sig, SIG_DFL);
       -        kill(getpid(), sig);
       +        raise(sig);
        }
       -        
       +
       +int
       +noted(int v)
       +{
       +        p9longjmp((*_notejmpbuf)()->b, v==NCONT ? 2 : 1);
       +        abort();
       +        return 0;
       +}
       +
        int
        notify(void (*f)(void*, char*))
        {
                int i;
                struct sigaction sa, osa;
        
       -        _p9uproc(0);
                memset(&sa, 0, sizeof sa);
                if(f == 0)
                        sa.sa_handler = SIG_DFL;
       t@@ -87,8 +108,12 @@ notify(void (*f)(void*, char*))
                        sigaction(sigs[i].sig, nil, &osa);
                        if(osa.sa_handler != SIG_DFL)
                                continue;
       -                sigemptyset(&sa.sa_mask);
       -                sigaddset(&sa.sa_mask, i);
       +                /*
       +                 * We assume that one jump buffer per thread
       +                 * is okay, which means that we can't deal with 
       +                 * signal handlers called during signal handlers.
       +                 */
       +                sigfillset(&sa.sa_mask);
                        if(sigs[i].restart)
                                sa.sa_flags |= SA_RESTART;
                        else
       t@@ -97,14 +122,3 @@ notify(void (*f)(void*, char*))
                }
                return 0;
        }
       -
       -int
       -noted(int v)
       -{
       -        Uproc *up;
       -
       -        up = _p9uproc(1);
       -        p9longjmp(up->notejb, v==NCONT ? 2 : 1);
       -        abort();
       -        return 0;
       -}
 (DIR) diff --git a/src/lib9/post9p.c b/src/lib9/post9p.c
       t@@ -14,7 +14,7 @@ post9pservice(int fd, char *name)
                free(ns);
                if(s == nil)
                        return -1;
       -        switch(rfork(RFPROC|RFFDG)){
       +        switch(fork()){
                case -1:
                        return -1;
                case 0:
 (DIR) diff --git a/src/lib9/rendez-futex.c b/src/lib9/rendez-futex.c
       t@@ -1,167 +0,0 @@
       -/*
       -     NAME
       -          rendezvous - user level process synchronization
       -
       -     SYNOPSIS
       -          ulong rendezvous(ulong tag, ulong value)
       -
       -     DESCRIPTION
       -          The rendezvous system call allows two processes to synchro-
       -          nize and exchange a value.  In conjunction with the shared
       -          memory system calls (see segattach(2) and fork(2)), it
       -          enables parallel programs to control their scheduling.
       -
       -          Two processes wishing to synchronize call rendezvous with a
       -          common tag, typically an address in memory they share.  One
       -          process will arrive at the rendezvous first; it suspends
       -          execution until a second arrives.  When a second process
       -          meets the rendezvous the value arguments are exchanged
       -          between the processes and returned as the result of the
       -          respective rendezvous system calls.  Both processes are
       -          awakened when the rendezvous succeeds.
       -
       -          The set of tag values which two processes may use to
       -          rendezvous-their tag space-is inherited when a process
       -          forks, unless RFREND is set in the argument to rfork; see
       -          fork(2).
       -
       -          If a rendezvous is interrupted the return value is ~0, so
       -          that value should not be used in normal communication.
       -
       - * This simulates rendezvous with shared memory, pause, and SIGUSR1.
       - */
       -
       -#include <u.h>
       -typedef u32int u32;
       -#include <errno.h>
       -#include <sys/time.h>
       -#define __user
       -#include <linux/linkage.h>
       -#include <linux/futex.h>
       -#include <libc.h>
       -
       -enum
       -{
       -        VOUSHASH = 257,
       -};
       -
       -typedef struct Vous Vous;
       -struct Vous
       -{
       -        Vous *link;
       -        Lock lk;
       -        int pid;
       -        ulong val;
       -        ulong tag;
       -};
       -
       -static Vous vouspool[2048];
       -static int nvousused;
       -static Vous *vousfree;
       -static Vous *voushash[VOUSHASH];
       -static Lock vouslock;
       -
       -static Vous*
       -getvous(void)
       -{
       -        Vous *v;
       -
       -        if(vousfree){
       -                v = vousfree;
       -                vousfree = v->link;
       -        }else if(nvousused < nelem(vouspool))
       -                v = &vouspool[nvousused++];
       -        else
       -                abort();
       -        return v;
       -}
       -
       -static void
       -putvous(Vous *v)
       -{
       -        lock(&vouslock);
       -        v->link = vousfree;
       -        vousfree = v;
       -        unlock(&vouslock);
       -}
       -
       -static Vous*
       -findvous(ulong tag, ulong val, int pid)
       -{
       -        int h;
       -        Vous *v, **l;
       -
       -        lock(&vouslock);
       -        h = tag%VOUSHASH;
       -        for(l=&voushash[h], v=*l; v; l=&(*l)->link, v=*l){
       -                if(v->tag == tag){
       -                        *l = v->link;
       -                        unlock(&vouslock);
       -                        return v;
       -                }
       -        }
       -        v = getvous();
       -        v->pid = pid;
       -        v->link = voushash[h];
       -        v->val = val;
       -        v->tag = tag;
       -        lock(&v->lk);
       -        voushash[h] = v;
       -        unlock(&vouslock);
       -        return v;
       -}
       -
       -#define DBG 0
       -ulong
       -rendezvous(ulong tag, ulong val)
       -{
       -        int me, vpid;
       -        ulong rval;
       -        Vous *v;
       -
       -        me = getpid();
       -        v = findvous(tag, val, me);
       -        if(v->pid == me){
       -                if(DBG)fprint(2, "pid is %d tag %lux, sleeping\n", me, tag);
       -                /*
       -                 * No rendezvous partner was found; the next guy
       -                 * through will find v and wake us, so we must go
       -                 * to sleep.
       -                 *
       -                 * To go to sleep:
       -                 *        1. disable USR1 signals.
       -                 *        2. unlock v->lk (tells waker okay to signal us).
       -                 *        3. atomically suspend and enable USR1 signals.
       -                 *
       -                 * The call to ignusr1() could be done once at 
       -                 * process creation instead of every time through rendezvous.
       -                 */
       -                v->val = val;
       -                unlock(&v->lk);
       -                while(sys_futex((u32int*)&v->tag, FUTEX_WAIT, tag, nil, nil) < 0 && errno==EINTR)
       -                        ;
       -                rval = v->val;
       -                if(DBG)fprint(2, "pid is %d, awake\n", me);
       -                putvous(v);
       -        }else{
       -                /*
       -                 * Found someone to meet.  Wake him:
       -                 *
       -                 *        A. lock v->lk (waits for him to get to his step 2)
       -                 *        B. send a USR1
       -                 *
       -                 * He won't get the USR1 until he suspends, which
       -                 * means it must wake him up (it can't get delivered
       -                 * before he sleeps).
       -                 */
       -                vpid = v->pid;
       -                lock(&v->lk);
       -                rval = v->val;
       -                v->val = val;
       -                v->tag++;
       -                unlock(&v->lk);
       -                sys_futex((u32int*)&v->tag, FUTEX_WAKE, 1, nil, nil);
       -        }
       -        return rval;
       -}
       -
 (DIR) diff --git a/src/lib9/rfork.c b/src/lib9/rfork.c
       t@@ -2,7 +2,6 @@
        #include <sys/wait.h>
        #include <signal.h>
        #include <libc.h>
       -#include "9proc.h"
        #undef rfork
        
        int
       t@@ -13,7 +12,6 @@ p9rfork(int flags)
                int n;
                char buf[128], *q;
        
       -        _p9uproc(0);
                if((flags&(RFPROC|RFFDG|RFMEM)) == (RFPROC|RFFDG)){
                        /* check other flags before we commit */
                        flags &= ~(RFPROC|RFFDG);
       t@@ -73,7 +71,6 @@ p9rfork(int flags)
                                        }
                                }
                        }
       -                _p9uproc(0);
                        if(pid != 0)
                                return pid;
                }