- realize a mailbox with a variable buffer size

git-svn-id: http://svn.lfbs.rwth-aachen.de/svn/scc/trunk/MetalSVM@40 315a16e6-25f9-4109-90ae-ca3045a26c18
This commit is contained in:
stefan 2010-08-04 18:00:33 +00:00
parent 507e2afe3b
commit 6a45b433ea
2 changed files with 25 additions and 18 deletions

View file

@ -30,6 +30,7 @@ extern "C" {
#define DEFAULT_STACK_SIZE (32*1024)
#define KMSG_SIZE (1024*1024)
#define PAGE_SIZE 4096
#define MAILBOX_SIZE 2
#define TIMER_FREQ 100 /* in HZ */
#define CLOCK_TICK_RATE 1193182 /* 8254 chip's internal oscillator frequency */

View file

@ -29,17 +29,20 @@ extern "C" {
#endif
typedef struct {
void* mail;
sem_t consume, produce;
void* buffer[MAILBOX_SIZE];
int wpos, rpos;
sem_t mails;
sem_t boxes;
} mailbox_t;
inline static int mailbox_init(mailbox_t* m) {
if (BUILTIN_EXPECT(!m, 0))
return -1;
m->mail = NULL;
sem_init(&m->consume, 0);
sem_init(&m->produce, 1);
memset(m->buffer, 0x00, sizeof(void*)*MAILBOX_SIZE);
m->wpos = m->rpos = 0;
sem_init(&m->mails, 0);
sem_init(&m->boxes, MAILBOX_SIZE);
return 0;
}
@ -48,8 +51,8 @@ inline static int mailbox_destroy(mailbox_t* m) {
if (BUILTIN_EXPECT(!m, 0))
return -1;
sem_destroy(&m->consume);
sem_destroy(&m->produce);
sem_destroy(&m->mails);
sem_destroy(&m->boxes);
return 0;
}
@ -58,9 +61,10 @@ inline static int mailbox_post(mailbox_t* m, void* mail) {
if (BUILTIN_EXPECT(!m, 0))
return -1;
sem_wait(&m->produce);
m->mail = mail;
sem_post(&m->consume);
sem_wait(&m->boxes);
m->buffer[m->wpos] = mail;
m->wpos = (m->wpos+1) % MAILBOX_SIZE;
sem_post(&m->mails);
return 0;
}
@ -69,10 +73,11 @@ inline static int mailbox_fetch(mailbox_t* m, void** mail) {
if (BUILTIN_EXPECT(!m || !mail, 0))
return -1;
sem_wait(&m->consume);
*mail = m->mail;
m->mail = NULL;
sem_post(&m->produce);
sem_wait(&m->mails);
*mail = m->buffer[m->rpos];
m->buffer[m->rpos] = NULL;
m->rpos = (m->rpos+1) % MAILBOX_SIZE;
sem_post(&m->boxes);
return 0;
}
@ -81,11 +86,12 @@ inline static int mailbox_tryfetch(mailbox_t* m, void** mail) {
if (BUILTIN_EXPECT(!m || !mail, 0))
return -1;
if (sem_trywait(&m->consume) != 0)
if (sem_trywait(&m->mails) != 0)
return -1;
*mail = m->mail;
m->mail = NULL;
sem_post(&m->produce);
*mail = m->buffer[m->rpos];
m->buffer[m->rpos] = NULL;
m->rpos = (m->rpos+1) % MAILBOX_SIZE;
sem_post(&m->boxes);
return 0;
}