aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib9/9proc.h23
-rw-r--r--src/lib9/_exits.c3
-rw-r--r--src/lib9/lock-pthread.c1
-rw-r--r--src/lib9/main.c2
-rw-r--r--src/lib9/mkfile3
-rw-r--r--src/lib9/notify.c58
-rw-r--r--src/lib9/post9p.c2
-rw-r--r--src/lib9/rendez-futex.c167
-rw-r--r--src/lib9/rfork.c3
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;
}