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 rendlock;
6 fd04aace 2003-11-23 devnull static Uproc *rendhash[RENDHASH];
7 fd04aace 2003-11-23 devnull
8 fd04aace 2003-11-23 devnull ulong
9 fd04aace 2003-11-23 devnull rendezvous(ulong tag, ulong val)
10 fd04aace 2003-11-23 devnull {
11 fd04aace 2003-11-23 devnull char c;
12 fd04aace 2003-11-23 devnull ulong ret;
13 fd04aace 2003-11-23 devnull Uproc *t, *self, **l;
14 fd04aace 2003-11-23 devnull
15 fd04aace 2003-11-23 devnull self = _p9uproc();
16 fd04aace 2003-11-23 devnull lock(&rendlock);
17 fd04aace 2003-11-23 devnull l = &rendhash[tag%RENDHASH];
18 fd04aace 2003-11-23 devnull for(t=*l; t; l=&t->rendhash, t=*l){
19 fd04aace 2003-11-23 devnull if(t->rendtag==tag){
20 fd04aace 2003-11-23 devnull *l = t->rendhash;
21 fd04aace 2003-11-23 devnull ret = t->rendval;
22 fd04aace 2003-11-23 devnull t->rendval = val;
23 fd04aace 2003-11-23 devnull t->rendtag++;
24 fd04aace 2003-11-23 devnull c = 0;
25 fd04aace 2003-11-23 devnull unlock(&rendlock);
26 fd04aace 2003-11-23 devnull write(t->pipe[1], &c, 1);
27 fd04aace 2003-11-23 devnull return ret;
28 fd04aace 2003-11-23 devnull }
29 fd04aace 2003-11-23 devnull }
30 fd04aace 2003-11-23 devnull
31 fd04aace 2003-11-23 devnull /* Going to sleep here. */
32 fd04aace 2003-11-23 devnull t = self;
33 fd04aace 2003-11-23 devnull t->rendtag = tag;
34 fd04aace 2003-11-23 devnull t->rendval = val;
35 fd04aace 2003-11-23 devnull t->rendhash = *l;
36 fd04aace 2003-11-23 devnull *l = t;
37 fd04aace 2003-11-23 devnull unlock(&rendlock);
38 fd04aace 2003-11-23 devnull do
39 fd04aace 2003-11-23 devnull read(t->pipe[0], &c, 1);
40 fd04aace 2003-11-23 devnull while(t->rendtag == tag);
41 fd04aace 2003-11-23 devnull return t->rendval;
42 fd04aace 2003-11-23 devnull }