All pastes #764182 Raw Edit

Stuff

public text v1 · immutable
·published 2007-11-07 00:15 UTC
rendered paste body

/* Fetch a message from queue 'q' and store it in 'm'  */
int mbox_recv(int q, msg_t * m)
{
	mbox_t *box = &Q[q];
	int sz;
	int i;

	lock_acquire(&box->l);
	while (box->count < 1)
		condition_wait(&box->l, &box->moreData);

	/* the size field can also be fragmented, so assemble it into m */
	for (i = 0; i < MSG_T_HEADER_SIZE; i++)
		((char *)m)[i] = box->buffer[(box->tail + i) % BUFFER_SIZE];

	sz = MSG_SIZE(m);

	for(; i < sz; i++)
		((char *)m)[i] = box->buffer[(box->tail + i) % BUFFER_SIZE];

	box->tail = (box->tail + sz) % BUFFER_SIZE;
	box->count--;
	/* notfiy everyone so that a message will be sent if *any* process has a
	   message that fits into the buffer */
	condition_broadcast(&box->moreSpace);
	lock_release(&box->l);
	return sz;		/*whatever - not a single caller checks the return value*/
}

/* Insert 'm' into the mailbox 'q'  */
int mbox_send(int q, msg_t * m)
{
	mbox_t *box = &Q[q];
	int sz = MSG_SIZE(m);
	int i;
	lock_acquire(&box->l);
	while (space_available(box) < sz)
		condition_wait(&box->l, &box->moreSpace);

	for (i = 0; i < sz; i++)
		box->buffer[(box->head + i) % BUFFER_SIZE] = ((char *)m)[i];

	box->head = (box->head + sz) % BUFFER_SIZE;
	box->count++;
	condition_signal(&box->moreData);
	lock_release(&box->l);
	return sz;		/*whatever - not a single caller checks the return value*/
}