Blob


1 #include <u.h>
2 #include <libc.h>
3 #include "9proc.h"
5 static Lock uproclock;
6 static Uproc *phash[PIDHASH];
8 Uproc*
9 _p9uproc(void)
10 {
11 /* for now, assume getpid is fast or cached */
12 int pid;
13 Uproc *up;
15 pid = getpid();
16 again:
17 if(0)print("find %d\n", pid);
18 lock(&uproclock);
19 for(up=phash[pid%PIDHASH]; up; up=up->next){
20 if(up->pid == pid){
21 if(0)print("found %d\n", pid);
22 unlock(&uproclock);
23 return up;
24 }
25 }
27 up = mallocz(sizeof(Uproc), 1);
28 if(up == nil){
29 if(0)print("again %d\n", pid);
30 unlock(&uproclock);
31 sleep(1000);
32 goto again;
33 }
35 againpipe:
36 if(pipe(up->pipe) < 0){
37 if(0)print("againpipe %d\n", pid);
38 sleep(1000);
39 goto againpipe;
40 }
42 up->pid = pid;
43 up->next = phash[pid%PIDHASH];
44 phash[pid%PIDHASH] = up;
45 if(0)print("link %d\n", pid);
46 unlock(&uproclock);
47 return up;
48 }
50 void
51 _p9uprocdie(void)
52 {
53 Uproc **l, *up;
54 int pid;
56 pid = getpid();
57 if(0)print("die %d\n", pid);
58 lock(&uproclock);
59 for(l=&phash[pid%33]; *l; l=&(*l)->next){
60 if((*l)->pid == pid){
61 up = *l;
62 *l = up->next;
63 if(0)print("died %d\n", pid);
64 unlock(&uproclock);
65 close(up->pipe[0]);
66 close(up->pipe[1]);
67 free(up);
68 return;
69 }
70 }
71 if(0)print("not started %d\n", pid);
72 unlock(&uproclock);
73 }