diff options
Diffstat (limited to 'src/lib9/rendez.c')
-rw-r--r-- | src/lib9/rendez.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/lib9/rendez.c b/src/lib9/rendez.c new file mode 100644 index 00000000..cf23a4e5 --- /dev/null +++ b/src/lib9/rendez.c @@ -0,0 +1,42 @@ +#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(); + 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; +} |