Blame


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