view TaskManager/kernel/ppe/MailManager.cc @ 648:f1e10ba45d28

Mail modification. Working on Mac OS X.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 21 Nov 2009 20:14:45 +0900
parents 7c9ded1ea750
children 55f898a58748
line wrap: on
line source

#include <stdlib.h>
#include "MailManager.h"

void
MailManager::calc_mask(unsigned int qsize) 
{
    mask = 1;
    while((qsize>>= 1)>0) {
	mask <<= 1;
    }
    size = mask;
    mask--;
}

MailManager::MailManager(unsigned int qsize) {
    calc_mask(qsize);
    queue = New(memaddr,size);
}

MailManager::~MailManager() { free(queue); }

int 
MailManager::count()
{
    return (write+size-read)&mask;
}

void 
MailManager::send(memaddr data)
{
    queue[write++] = data;
    if (write==read) {

	calc_mask(size*2);

	memaddr *newq = New(memaddr,size);
	int i;
	while(count()>0) {
	    newq[i++] = recv();
	}
	read = 0; write = i;
	free(queue);
	queue = newq;
    }
    write &= mask;
}

memaddr 
MailManager::recv()
{
    memaddr data;
    if (count()>0) {
	data = queue[read++];
	read &= mask;
    } else {
	data = 0;
    }
    return data;
}

/* end */