Mercurial > hg > Members > kono > Cerium
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 */