diff options
| author | rsc <devnull@localhost> | 2003-11-23 18:12:54 +0000 |
|---|---|---|
| committer | rsc <devnull@localhost> | 2003-11-23 18:12:54 +0000 |
| commit | fd04aacee17b348da206c13a550dc1029669805f (patch) | |
| tree | 9bdd35a25ff6e3d6e9a0171b06240a76723f922c /src/lib9/rendez.c | |
| parent | 74f990ad84deb1591ddb91be4fc8152ec0c46222 (diff) | |
| download | plan9port-fd04aacee17b348da206c13a550dc1029669805f.tar.gz plan9port-fd04aacee17b348da206c13a550dc1029669805f.zip | |
Various additions and fixes.
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; +} |
