Beispiel #1
0
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);
}
Beispiel #2
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;
}