diff options
author | rsc <devnull@localhost> | 2004-09-23 03:01:36 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-09-23 03:01:36 +0000 |
commit | 7966faa931bfa9cf4ca53dd2d5b6e1eb0f174411 (patch) | |
tree | cbf2c9099f0d78c2c26aeea687803d43049db521 /src/libthread/sleep.c | |
parent | c6687d4591964cb13df87f55ec4770e778a4a55c (diff) | |
download | plan9port-7966faa931bfa9cf4ca53dd2d5b6e1eb0f174411.tar.gz plan9port-7966faa931bfa9cf4ca53dd2d5b6e1eb0f174411.tar.bz2 plan9port-7966faa931bfa9cf4ca53dd2d5b6e1eb0f174411.zip |
Continue fighting pthreads.
Clean up thread library a bit too.
Diffstat (limited to 'src/libthread/sleep.c')
-rw-r--r-- | src/libthread/sleep.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/libthread/sleep.c b/src/libthread/sleep.c new file mode 100644 index 00000000..d6c4dac4 --- /dev/null +++ b/src/libthread/sleep.c @@ -0,0 +1,38 @@ +#include "threadimpl.h" + +int _threadhighnrendez; +int _threadnrendez; + +void +_threadsleep(_Procrend *r) +{ + Thread *t; + + t = _threadgetproc()->thread; + r->arg = t; + t->nextstate = Rendezvous; + t->asleep = 1; + unlock(r->l); + _sched(); + t->asleep = 0; + lock(r->l); +} + +void +_threadwakeup(_Procrend *r) +{ + Thread *t; + + t = r->arg; + while(t->state == Running) + sleep(0); + lock(&t->proc->lock); + if(t->state == Dead){ + unlock(&t->proc->lock); + return; + } + assert(t->state == Rendezvous && t->asleep); + t->state = Ready; + _threadready(t); + unlock(&t->proc->lock); +} |