int Chan_receive(Chan_T c, void *ptr, int size) { int n; assert(c); assert(ptr); assert(size >= 0); Sem_wait(&c->recv); n = *c->size; if (size < n) n = size; *c->size = n; if (n > 0) memcpy(ptr, c->ptr, n); Sem_signal(&c->sync); Sem_signal(&c->send); return n; }
int Chan_send(Chan_T c, const void *ptr, int size) { assert(c); assert(ptr); assert(size >= 0); Sem_wait(&c->send); c->ptr = ptr; c->size = &size; Sem_signal(&c->recv); Sem_wait(&c->sync); return size; }
void incr(struct args *p) { int i; static int j; for (i = 0; i < 10000; i++) { Sem_wait(p->mutex); *p->ip = *p->ip + 1; Sem_signal(p->mutex); } printf("%d:(%d:y)=%d\n", j, Thread_self(), y); j++; }