chan mill_chmake(size_t sz, size_t bufsz) { /* We are allocating 1 additional element after the channel buffer to store the done-with value. It can't be stored in the regular buffer because that would mean chdone() would block when buffer is full. */ struct mill_chan *ch = (struct mill_chan*) malloc(sizeof(struct mill_chan) + (sz * (bufsz + 1))); if(!ch) return NULL; ch->sz = sz; ch->sender.type = MILL_SENDER; ch->sender.seqnum = mill_choose_seqnum; mill_list_init(&ch->sender.clauses); ch->receiver.type = MILL_RECEIVER; ch->receiver.seqnum = mill_choose_seqnum; mill_list_init(&ch->receiver.clauses); ch->refcount = 1; ch->done = 0; ch->bufsz = bufsz; ch->items = 0; ch->first = 0; return ch; }
void mill_timer_postfork(void) { mill_list_init(&mill_timers); }