diff options
Diffstat (limited to 'src/cmd/devdraw/cocoa-thread.c')
-rw-r--r-- | src/cmd/devdraw/cocoa-thread.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/cmd/devdraw/cocoa-thread.c b/src/cmd/devdraw/cocoa-thread.c new file mode 100644 index 00000000..4b2443ce --- /dev/null +++ b/src/cmd/devdraw/cocoa-thread.c @@ -0,0 +1,54 @@ +#include <u.h> +#include <libc.h> +#include "cocoa-thread.h" + +static pthread_mutex_t initlock = PTHREAD_MUTEX_INITIALIZER; + +void +qlock(QLock *q) +{ + if(q->init == 0){ + pthread_mutex_lock(&initlock); + if(q->init == 0){ + pthread_mutex_init(&q->m, nil); + q->init = 1; + } + pthread_mutex_unlock(&initlock); + } + pthread_mutex_lock(&q->m); +} + +void +qunlock(QLock *q) +{ + pthread_mutex_unlock(&q->m); +} + +static void +rinit(Rendez *r) +{ + pthread_mutex_lock(&initlock); + if(r->init == 0){ + pthread_cond_init(&r->c, nil); + r->init = 1; + } + pthread_mutex_unlock(&initlock); +} + +void +rsleep(Rendez *r) +{ + if(r->init == 0) + rinit(r); + pthread_cond_wait(&r->c, &r->l->m); +} + +int +rwakeup(Rendez *r) +{ + if(r->init == 0) + rinit(r); + pthread_cond_signal(&r->c); + + return 0; +} |