diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib9/9proc.h | 23 | ||||
-rw-r--r-- | src/lib9/_exits.c | 3 | ||||
-rw-r--r-- | src/lib9/lock-pthread.c | 1 | ||||
-rw-r--r-- | src/lib9/main.c | 2 | ||||
-rw-r--r-- | src/lib9/mkfile | 3 | ||||
-rw-r--r-- | src/lib9/notify.c | 58 | ||||
-rw-r--r-- | src/lib9/post9p.c | 2 | ||||
-rw-r--r-- | src/lib9/rendez-futex.c | 167 | ||||
-rw-r--r-- | src/lib9/rfork.c | 3 |
9 files changed, 38 insertions, 224 deletions
diff --git a/src/lib9/9proc.h b/src/lib9/9proc.h deleted file mode 100644 index 0c359c9e..00000000 --- a/src/lib9/9proc.h +++ /dev/null @@ -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 diff --git a/src/lib9/_exits.c b/src/lib9/_exits.c index 9affe948..5e7c88ed 100644 --- a/src/lib9/_exits.c +++ b/src/lib9/_exits.c @@ -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); diff --git a/src/lib9/lock-pthread.c b/src/lib9/lock-pthread.c index 689261f6..eb3ea21d 100644 --- a/src/lib9/lock-pthread.c +++ b/src/lib9/lock-pthread.c @@ -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; diff --git a/src/lib9/main.c b/src/lib9/main.c index 5b2635b4..4a429054 100644 --- a/src/lib9/main.c +++ b/src/lib9/main.c @@ -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; diff --git a/src/lib9/mkfile b/src/lib9/mkfile index 9200d81c..133fcf41 100644 --- a/src/lib9/mkfile +++ b/src/lib9/mkfile @@ -67,7 +67,6 @@ LIB9OFILES=\ _exits.$O\ _p9dialparse.$O\ _p9dir.$O\ - _p9proc-$SYSNAME.$O\ announce.$O\ argv0.$O\ atexit.$O\ @@ -99,8 +98,6 @@ LIB9OFILES=\ errstr.$O\ exec.$O\ fcallfmt.$O\ - fork.$O\ - ffork-$SYSNAME.$O\ get9root.$O\ getcallerpc-$OBJTYPE.$O\ getenv.$O\ diff --git a/src/lib9/notify.c b/src/lib9/notify.c index 9156f891..7f22e0fa 100644 --- a/src/lib9/notify.c +++ b/src/lib9/notify.c @@ -2,7 +2,6 @@ #include <signal.h> #define NOPLAN9DEFINES #include <libc.h> -#include "9proc.h" extern char *_p9sigstr(int, char*); @@ -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 @@ -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; @@ -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 @@ -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; -} diff --git a/src/lib9/post9p.c b/src/lib9/post9p.c index 35ba3167..ddedf62e 100644 --- a/src/lib9/post9p.c +++ b/src/lib9/post9p.c @@ -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: diff --git a/src/lib9/rendez-futex.c b/src/lib9/rendez-futex.c deleted file mode 100644 index 7d5e21eb..00000000 --- a/src/lib9/rendez-futex.c +++ /dev/null @@ -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; -} - diff --git a/src/lib9/rfork.c b/src/lib9/rfork.c index d3c8f8b2..aec051a9 100644 --- a/src/lib9/rfork.c +++ b/src/lib9/rfork.c @@ -2,7 +2,6 @@ #include <sys/wait.h> #include <signal.h> #include <libc.h> -#include "9proc.h" #undef rfork int @@ -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); @@ -73,7 +71,6 @@ p9rfork(int flags) } } } - _p9uproc(0); if(pid != 0) return pid; } |