| #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); |
| } |
| |