#include <u.h> | |
#include <libc.h> | |
#include "9proc.h" | |
static Lock rendlock; | |
static Uproc *rendhash[RENDHASH]; | |
ulong | |
rendezvous(ulong tag, ulong val) | |
{ | |
char c; | |
ulong ret; | |
Uproc *t, *self, **l; | |
self = _p9uproc(0); | |
lock(&rendlock); | |
l = &rendhash[tag%RENDHASH]; | |
for(t=*l; t; l=&t->rendhash, t=*l){ | |
if(t->rendtag==tag){ | |
*l = t->rendhash; | |
ret = t->rendval; | |
t->rendval = val; | |
t->rendtag++; | |
c = 0; | |
unlock(&rendlock); | |
write(t->pipe[1], &c, 1); | |
return ret; | |
} | |
} | |
/* Going to sleep here. */ | |
t = self; | |
t->rendtag = tag; | |
t->rendval = val; | |
t->rendhash = *l; | |
*l = t; | |
unlock(&rendlock); | |
do | |
read(t->pipe[0], &c, 1); | |
while(t->rendtag == tag); | |
return t->rendval; | |
} |