diff --git a/sys/src/kern/port/sysproc.c b/sys/src/kern/port/sysproc.c index e742a9d..3956135 100644 --- a/sys/src/kern/port/sysproc.c +++ b/sys/src/kern/port/sysproc.c @@ -821,6 +821,15 @@ sysrendezvous(void* tagp, void* rendvalp) up->rendval = ~0; lock(&up->rgrp->l); + + /* NOTE: + * In Jehanne, the rendezvous point ~0 is always private: + * it can only be interrupted from a scheduled wakeup + * (see sysawake) or from a note + */ + if(tag == (uintptr_t)~0) + goto rendezvousBlocks; + for(p = *l; p; p = p->rendhash) { if(p->rendtag == tag) { *l = p->rendhash; @@ -839,6 +848,7 @@ sysrendezvous(void* tagp, void* rendvalp) l = &p->rendhash; } +rendezvousBlocks: up->blockingsc = up->cursyscall; if(awakeOnBlock(up)){ unlock(&up->rgrp->l); diff --git a/sys/src/lib/c/9sys/sleep.c b/sys/src/lib/c/9sys/sleep.c index 99fb541..7fe3133 100644 --- a/sys/src/lib/c/9sys/sleep.c +++ b/sys/src/lib/c/9sys/sleep.c @@ -26,7 +26,7 @@ jehanne_sleep(int32_t millisecs) wakeup = awake(millisecs); // give up the processor, in any case if(millisecs > 0) - while(rendezvous(&wakeup, (void*)1) == (void*)~0) + while(rendezvous((void*)~0, (void*)1) == (void*)~0) if(jehanne_awakened(wakeup)) return; }