#include <u.h>
#include <libc.h>

void
rendsleep(Pmrendez *r, int (*f)(void*), void *arg)
{
	Pmproc *up;

	up = pm_getup();
	up->r = r;
	qlock(&r->lk);

	if(f(arg)){
		up->r = nil;
		qunlock(&r->lk);
		return;
	}
	if(r->p != nil)
		pm_panic("rendsleep");
	r->p = up;
	qunlock(&r->lk);
	rendezvous((ulong)up, 0);
}

Pmproc*
rendwakeup(Pmrendez *r)
{
	Pmproc *p;

	qlock(&r->lk);
	p = r->p;
	if(p != nil){
		r->p = nil;
		p->r = nil;
		rendezvous((ulong)p, 0);
	}
	qunlock(&r->lk);
	return p;
}



syntax highlighted by Code2HTML, v. 0.9.1