diff options
author | rsc <devnull@localhost> | 2003-11-23 18:12:54 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2003-11-23 18:12:54 +0000 |
commit | fd04aacee17b348da206c13a550dc1029669805f (patch) | |
tree | 9bdd35a25ff6e3d6e9a0171b06240a76723f922c /src/lib9/_p9proc.c | |
parent | 74f990ad84deb1591ddb91be4fc8152ec0c46222 (diff) | |
download | plan9port-fd04aacee17b348da206c13a550dc1029669805f.tar.gz plan9port-fd04aacee17b348da206c13a550dc1029669805f.tar.bz2 plan9port-fd04aacee17b348da206c13a550dc1029669805f.zip |
Various additions and fixes.
Diffstat (limited to 'src/lib9/_p9proc.c')
-rw-r--r-- | src/lib9/_p9proc.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/lib9/_p9proc.c b/src/lib9/_p9proc.c new file mode 100644 index 00000000..6e4010cd --- /dev/null +++ b/src/lib9/_p9proc.c @@ -0,0 +1,73 @@ +#include <u.h> +#include <libc.h> +#include "9proc.h" + +static Lock uproclock; +static Uproc *phash[PIDHASH]; + +Uproc* +_p9uproc(void) +{ + /* for now, assume getpid is fast or cached */ + int pid; + Uproc *up; + + pid = getpid(); +again: +if(0)print("find %d\n", pid); + lock(&uproclock); + for(up=phash[pid%PIDHASH]; up; up=up->next){ + if(up->pid == pid){ +if(0)print("found %d\n", pid); + unlock(&uproclock); + return up; + } + } + + up = mallocz(sizeof(Uproc), 1); + if(up == nil){ +if(0)print("again %d\n", pid); + unlock(&uproclock); + sleep(1000); + goto again; + } + +againpipe: + if(pipe(up->pipe) < 0){ +if(0)print("againpipe %d\n", pid); + sleep(1000); + goto againpipe; + } + + up->pid = pid; + up->next = phash[pid%PIDHASH]; + phash[pid%PIDHASH] = up; +if(0)print("link %d\n", pid); + unlock(&uproclock); + return up; +} + +void +_p9uprocdie(void) +{ + Uproc **l, *up; + int pid; + + pid = getpid(); +if(0)print("die %d\n", pid); + lock(&uproclock); + for(l=&phash[pid%33]; *l; l=&(*l)->next){ + if((*l)->pid == pid){ + up = *l; + *l = up->next; +if(0)print("died %d\n", pid); + unlock(&uproclock); + close(up->pipe[0]); + close(up->pipe[1]); + free(up); + return; + } + } +if(0)print("not started %d\n", pid); + unlock(&uproclock); +} |