Blame


1 7c709434 2005-03-18 devnull #include <u.h>
2 7c709434 2005-03-18 devnull #include <libc.h>
3 7c709434 2005-03-18 devnull #include <thread.h>
4 7c709434 2005-03-18 devnull #include <9pclient.h>
5 7c709434 2005-03-18 devnull #include "acme.h"
6 7c709434 2005-03-18 devnull
7 7c709434 2005-03-18 devnull extern int debug;
8 7c709434 2005-03-18 devnull
9 590c5b34 2005-03-21 devnull #define dprint if(debug>1)print
10 7c709434 2005-03-18 devnull
11 7c709434 2005-03-18 devnull typedef struct Waitreq Waitreq;
12 7c709434 2005-03-18 devnull struct Waitreq
13 7c709434 2005-03-18 devnull {
14 7c709434 2005-03-18 devnull int pid;
15 7c709434 2005-03-18 devnull Channel *c;
16 7c709434 2005-03-18 devnull };
17 7c709434 2005-03-18 devnull
18 7c709434 2005-03-18 devnull /*
19 7c709434 2005-03-18 devnull * watch the exiting children
20 7c709434 2005-03-18 devnull */
21 7c709434 2005-03-18 devnull Channel *twaitchan; /* chan(Waitreq) */
22 7c709434 2005-03-18 devnull void
23 7c709434 2005-03-18 devnull waitthread(void *v)
24 7c709434 2005-03-18 devnull {
25 7c709434 2005-03-18 devnull Alt a[3];
26 7c709434 2005-03-18 devnull Waitmsg *w, **wq;
27 7c709434 2005-03-18 devnull Waitreq *rq, r;
28 7c709434 2005-03-18 devnull int i, nrq, nwq;
29 7c709434 2005-03-18 devnull
30 7c709434 2005-03-18 devnull threadsetname("waitthread");
31 7c709434 2005-03-18 devnull a[0].c = threadwaitchan();
32 7c709434 2005-03-18 devnull a[0].v = &w;
33 7c709434 2005-03-18 devnull a[0].op = CHANRCV;
34 7c709434 2005-03-18 devnull a[1].c = twaitchan;
35 7c709434 2005-03-18 devnull a[1].v = &r;
36 7c709434 2005-03-18 devnull a[1].op = CHANRCV;
37 7c709434 2005-03-18 devnull a[2].op = CHANEND;
38 7c709434 2005-03-18 devnull
39 7c709434 2005-03-18 devnull nrq = 0;
40 7c709434 2005-03-18 devnull nwq = 0;
41 7c709434 2005-03-18 devnull rq = nil;
42 7c709434 2005-03-18 devnull wq = nil;
43 7c709434 2005-03-18 devnull dprint("wait: start\n");
44 7c709434 2005-03-18 devnull for(;;){
45 7c709434 2005-03-18 devnull cont2:;
46 7c709434 2005-03-18 devnull dprint("wait: alt\n");
47 7c709434 2005-03-18 devnull switch(alt(a)){
48 7c709434 2005-03-18 devnull case 0:
49 7c709434 2005-03-18 devnull dprint("wait: pid %d exited\n", w->pid);
50 7c709434 2005-03-18 devnull for(i=0; i<nrq; i++){
51 7c709434 2005-03-18 devnull if(rq[i].pid == w->pid){
52 7c709434 2005-03-18 devnull dprint("wait: match with rq chan %p\n", rq[i].c);
53 7c709434 2005-03-18 devnull sendp(rq[i].c, w);
54 7c709434 2005-03-18 devnull rq[i] = rq[--nrq];
55 7c709434 2005-03-18 devnull goto cont2;
56 7c709434 2005-03-18 devnull }
57 7c709434 2005-03-18 devnull }
58 7c709434 2005-03-18 devnull if(i == nrq){
59 7c709434 2005-03-18 devnull dprint("wait: queueing waitmsg\n");
60 7c709434 2005-03-18 devnull wq = erealloc(wq, (nwq+1)*sizeof(wq[0]));
61 7c709434 2005-03-18 devnull wq[nwq++] = w;
62 7c709434 2005-03-18 devnull }
63 7c709434 2005-03-18 devnull break;
64 fa325e9b 2020-01-10 cross
65 7c709434 2005-03-18 devnull case 1:
66 7c709434 2005-03-18 devnull dprint("wait: req for pid %d chan %p\n", r.pid, r.c);
67 7c709434 2005-03-18 devnull for(i=0; i<nwq; i++){
68 7c709434 2005-03-18 devnull if(w->pid == r.pid){
69 7c709434 2005-03-18 devnull dprint("wait: match with waitmsg\n");
70 7c709434 2005-03-18 devnull sendp(r.c, w);
71 7c709434 2005-03-18 devnull wq[i] = wq[--nwq];
72 7c709434 2005-03-18 devnull goto cont2;
73 7c709434 2005-03-18 devnull }
74 7c709434 2005-03-18 devnull }
75 7c709434 2005-03-18 devnull if(i == nwq){
76 7c709434 2005-03-18 devnull dprint("wait: queueing req\n");
77 7c709434 2005-03-18 devnull rq = erealloc(rq, (nrq+1)*sizeof(rq[0]));
78 7c709434 2005-03-18 devnull rq[nrq] = r;
79 7c709434 2005-03-18 devnull dprint("wait: queueing req pid %d chan %p\n", rq[nrq].pid, rq[nrq].c);
80 7c709434 2005-03-18 devnull nrq++;
81 7c709434 2005-03-18 devnull }
82 7c709434 2005-03-18 devnull break;
83 7c709434 2005-03-18 devnull }
84 7c709434 2005-03-18 devnull }
85 7c709434 2005-03-18 devnull }
86 7c709434 2005-03-18 devnull
87 7c709434 2005-03-18 devnull Waitmsg*
88 7c709434 2005-03-18 devnull twaitfor(int pid)
89 7c709434 2005-03-18 devnull {
90 7c709434 2005-03-18 devnull Waitreq r;
91 7c709434 2005-03-18 devnull Waitmsg *w;
92 fa325e9b 2020-01-10 cross
93 7c709434 2005-03-18 devnull r.pid = pid;
94 7c709434 2005-03-18 devnull r.c = chancreate(sizeof(Waitmsg*), 1);
95 7c709434 2005-03-18 devnull send(twaitchan, &r);
96 7c709434 2005-03-18 devnull w = recvp(r.c);
97 7c709434 2005-03-18 devnull chanfree(r.c);
98 7c709434 2005-03-18 devnull return w;
99 7c709434 2005-03-18 devnull }
100 7c709434 2005-03-18 devnull
101 7c709434 2005-03-18 devnull int
102 7c709434 2005-03-18 devnull twait(int pid)
103 7c709434 2005-03-18 devnull {
104 7c709434 2005-03-18 devnull int x;
105 7c709434 2005-03-18 devnull Waitmsg *w;
106 fa325e9b 2020-01-10 cross
107 7c709434 2005-03-18 devnull w = twaitfor(pid);
108 7c709434 2005-03-18 devnull x = w->msg[0] != 0 ? -1 : 0;
109 7c709434 2005-03-18 devnull free(w);
110 7c709434 2005-03-18 devnull return x;
111 7c709434 2005-03-18 devnull }
112 7c709434 2005-03-18 devnull
113 7c709434 2005-03-18 devnull void
114 7c709434 2005-03-18 devnull twaitinit(void)
115 7c709434 2005-03-18 devnull {
116 7c709434 2005-03-18 devnull threadwaitchan(); /* allocate it before returning */
117 7c709434 2005-03-18 devnull twaitchan = chancreate(sizeof(Waitreq), 10);
118 7c709434 2005-03-18 devnull threadcreate(waitthread, nil, 128*1024);
119 7c709434 2005-03-18 devnull }