diff options
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); +} |