void channel_write (channel_t *channel, void *msg, size_t len) { channel_node_t *node = store_alloc(global.store, sizeof(channel_node_t) + len); node->next = NULL; node->length = len; memmove(node->payload, msg, len); ensure(pthread_mutex_lock(&channel->mutex) == 0); channel->writers++; while (channel->limit > 0 && channel->backlog == channel->limit) ensure(pthread_cond_wait(&channel->cond_write, &channel->mutex) == 0); channel->backlog++; if (!channel->list) { channel->list = node; channel->last = node; } else { channel->last->next = node; channel->last = node; } if (channel->readers) ensure(pthread_cond_signal(&channel->cond_read) == 0); channel->writers--; ensure(pthread_mutex_unlock(&channel->mutex) == 0); }
// EXTERNAL API page_p bvec_create(struct store *s) { page_p page = store_alloc(s, BVEC_DEF_PAGE_SIZE); bvec_hdr_write(s, page, 0, BVEC_DEF_PAGE_SIZE, 0, BVEC_HEADER_SIZE, 0); return page; }