diff TaskManager/kernel/ppe/MailManager.cc @ 647:7c9ded1ea750

MailManager rewrite. not yet worked.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 21 Nov 2009 16:18:47 +0900
parents 5e1a477fcaec
children 55f898a58748
line wrap: on
line diff
--- a/TaskManager/kernel/ppe/MailManager.cc	Sat Nov 21 11:20:29 2009 +0900
+++ b/TaskManager/kernel/ppe/MailManager.cc	Sat Nov 21 16:18:47 2009 +0900
@@ -1,133 +1,61 @@
-#include <stdio.h>
 #include <stdlib.h>
 #include "MailManager.h"
 
-MailManager::MailManager(void)
-    :mailQueuePool(NULL), freeMailQueue(NULL) {}
-
-MailManager::~MailManager(void) { destroy(); }
-
-int
-MailManager::init(int num)
+void
+MailManager::calc_mask(unsigned int qsize) 
 {
-    if (!mailQueuePool) {
-	return extend_pool(num);
+    mask = 1;
+    while((qsize>>= 1)>0) {
+	mask <<= 1;
     }
-    return 0;
+    size = mask;
+    mask--;
 }
 
-int
-MailManager::extend_pool(int num)
-{
-    MailQueuePtr q;
-	
-    q = (MailQueuePtr)malloc(sizeof(MailQueue)*(num+1));
-	
-    if (q == NULL) {
-	return -1;
-    }
-    q->next = mailQueuePool;
-    mailQueuePool = q;
-	
-    /* Connect all free queue in the pool */
-    for (q = mailQueuePool + 1; --num > 0; q++) {
-	q->next = q + 1;
-    }
-    q->next = freeMailQueue;
-    freeMailQueue = mailQueuePool + 1;
-	
-    return 0;
+MailManager::MailManager(unsigned int qsize) {
+    calc_mask(qsize);
+    queue = New(memaddr,size);
 }
 
-MailQueuePtr
-MailManager::create(memaddr data)
+MailManager::~MailManager() { free(queue); }
+
+int 
+MailManager::count()
 {
-    MailQueuePtr q;
-	
-    if (!freeMailQueue) {
-	extend_pool(30);
-    }
-    q = freeMailQueue;
-    freeMailQueue = freeMailQueue->next;
-	
-    q->data = data;
-    q->next = NULL;
-	
-    return q;
+    return (write+size-read)&mask;
 }
 
-void
-MailManager::free(MailQueuePtr q)
+void 
+MailManager::send(memaddr data)
 {
-#if 0
-    if (MailManager::find(q,freeMailQueue)) {
-	fprintf(stderr,"double free %s\n",__FUNCTION__);
-	return;
-    }
-#endif
-    q->next = freeMailQueue;
-    freeMailQueue = q;
-}
+    queue[write++] = data;
+    if (write==read) {
+
+	calc_mask(size*2);
 
-
-void
-MailManager::destroy(void)
-{
-    MailQueuePtr q;
-
-    q = mailQueuePool;
-    while (q) {
-	MailQueuePtr tmp = q->next;
-	free(q);
-	q = tmp;
+	memaddr *newq = New(memaddr,size);
+	int i;
+	while(count()>0) {
+	    newq[i++] = recv();
+	}
+	read = 0; write = i;
+	free(queue);
+	queue = newq;
     }
-    freeMailQueue = mailQueuePool = NULL;
+    write &= mask;
 }
 
-
-MailQueuePtr
-MailManager::append_mailQueue(MailQueuePtr list, MailQueuePtr q)
-{
-    MailQueuePtr p = list;
-	
-    if (p == NULL) {
-	return q;
-    } else {
-	while(p->next) p = p->next;
-	p->next = q;
-	return list;
-    }
-}
-
-int
-MailManager::length(MailQueuePtr list)
+memaddr 
+MailManager::recv()
 {
-    MailQueuePtr p = list;
-    MailQueuePtr q = p;
-    int i = 0;
-
-    while(p) {
-	i++;
-	p=p->next;
-	if (i%2==0) {
-	    q = q->next;
-	}
-	if (p==q)
-	    return -1; // means loop
+    memaddr data;
+    if (count()>0) {
+	data = queue[read++];
+	read &= mask;
+    } else {
+	data = 0;
     }
-    return i;
-}
-
-int
-MailManager::find(MailQueuePtr q,MailQueuePtr list)
-{
-    MailQueuePtr p = list;
-    while(p) {
-	if (p==q)
-	    return -1; 
-        p = p->next;
-    }
-    return 0;
+    return data;
 }
 
 /* end */