Mailboxes

Mailbox is not a Solaris feature. To use it, you need all files provided on this page.

A mailbox is a place for threads to deposit and retrieve messages. Thus, a mailbox can be used by many threads. For our purpose, a message is simply an integer and a mailbox can hold no more than one message (i.e., the capacity of a mailbox is 1). Threads that put messages into a mailbox are senders and threads retrieves messages from a mailbox are receivers.

In fact, if we consider senders as producers and receivers as consumers, a mailbox is simply a bounded buffer with only one element. Thus, its implementation is very simple. We shall return to this later.

Syntax

#include  "mbox.h"

mbox_t   Box;

int  msg_init(mbox_t  *Box);
int  msg_send(mbox_t  *Box, int *Data);
int  msg_receive(mbox_t *Box, int *Data);

As mentioned earlier, a mailbox is simply a bounded buffer of one entry. The following is part of the mbox.h header file.

Click here to download mbox.h.

#include  <thread.h>
#include  <synch.h>

typedef struct mmBox {
     int     Data;
     sema_t  NotFull;
     sema_t  NotEmpty;
}  mbox_t;

int  msg_init(mbox_t *);
int  msg_send(mbox_t *, int *);
int  msg_receive(mbox_t *, int *);

The following is the implementation file mbox.c. Please compare it with the general implementation of bounded buffer discussed earlier.

Click here to download mbox.c.

#include  <thread.h>
#include  <synch.h>

#include  "mbox.h"

int  msg_init(mbox_t *MailBox)
{
     sema_init(&(MailBox->NotFull), 1, USYNC_THREAD, (void *) NULL);
     sema_init(&(MailBox->NotEmpty), 0, USYNC_THREAD, (void *) NULL);
     MailBox->Data = 0;
     return (0);
}

int  msg_send(mbox_t *MailBox, int *Value)
{
     sema_wait(&(MailBox->NotFull));
     MailBox->Data = *Value;
     sema_post(&(MailBox->NotEmpty));
     return  (*Value);
}

int  msg_receive(mbox_t *MailBox, int *Value)
{
     sema_wait(&(MailBox->NotEmpty));
     *Value = MailBox->Data;
     sema_post(&(MailBox->NotFull));
     return (*Value);
}