comparison 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
comparison
equal deleted inserted replaced
646:ffcc25c7c566 647:7c9ded1ea750
1 #include <stdio.h>
2 #include <stdlib.h> 1 #include <stdlib.h>
3 #include "MailManager.h" 2 #include "MailManager.h"
4 3
5 MailManager::MailManager(void) 4 void
6 :mailQueuePool(NULL), freeMailQueue(NULL) {} 5 MailManager::calc_mask(unsigned int qsize)
7
8 MailManager::~MailManager(void) { destroy(); }
9
10 int
11 MailManager::init(int num)
12 { 6 {
13 if (!mailQueuePool) { 7 mask = 1;
14 return extend_pool(num); 8 while((qsize>>= 1)>0) {
9 mask <<= 1;
15 } 10 }
16 return 0; 11 size = mask;
12 mask--;
17 } 13 }
18 14
19 int 15 MailManager::MailManager(unsigned int qsize) {
20 MailManager::extend_pool(int num) 16 calc_mask(qsize);
21 { 17 queue = New(memaddr,size);
22 MailQueuePtr q;
23
24 q = (MailQueuePtr)malloc(sizeof(MailQueue)*(num+1));
25
26 if (q == NULL) {
27 return -1;
28 }
29 q->next = mailQueuePool;
30 mailQueuePool = q;
31
32 /* Connect all free queue in the pool */
33 for (q = mailQueuePool + 1; --num > 0; q++) {
34 q->next = q + 1;
35 }
36 q->next = freeMailQueue;
37 freeMailQueue = mailQueuePool + 1;
38
39 return 0;
40 } 18 }
41 19
42 MailQueuePtr 20 MailManager::~MailManager() { free(queue); }
43 MailManager::create(memaddr data) 21
22 int
23 MailManager::count()
44 { 24 {
45 MailQueuePtr q; 25 return (write+size-read)&mask;
46
47 if (!freeMailQueue) {
48 extend_pool(30);
49 }
50 q = freeMailQueue;
51 freeMailQueue = freeMailQueue->next;
52
53 q->data = data;
54 q->next = NULL;
55
56 return q;
57 } 26 }
58 27
59 void 28 void
60 MailManager::free(MailQueuePtr q) 29 MailManager::send(memaddr data)
61 { 30 {
62 #if 0 31 queue[write++] = data;
63 if (MailManager::find(q,freeMailQueue)) { 32 if (write==read) {
64 fprintf(stderr,"double free %s\n",__FUNCTION__); 33
65 return; 34 calc_mask(size*2);
35
36 memaddr *newq = New(memaddr,size);
37 int i;
38 while(count()>0) {
39 newq[i++] = recv();
40 }
41 read = 0; write = i;
42 free(queue);
43 queue = newq;
66 } 44 }
67 #endif 45 write &= mask;
68 q->next = freeMailQueue;
69 freeMailQueue = q;
70 } 46 }
71 47
72 48 memaddr
73 void 49 MailManager::recv()
74 MailManager::destroy(void)
75 { 50 {
76 MailQueuePtr q; 51 memaddr data;
77 52 if (count()>0) {
78 q = mailQueuePool; 53 data = queue[read++];
79 while (q) { 54 read &= mask;
80 MailQueuePtr tmp = q->next; 55 } else {
81 free(q); 56 data = 0;
82 q = tmp;
83 } 57 }
84 freeMailQueue = mailQueuePool = NULL; 58 return data;
85 }
86
87
88 MailQueuePtr
89 MailManager::append_mailQueue(MailQueuePtr list, MailQueuePtr q)
90 {
91 MailQueuePtr p = list;
92
93 if (p == NULL) {
94 return q;
95 } else {
96 while(p->next) p = p->next;
97 p->next = q;
98 return list;
99 }
100 }
101
102 int
103 MailManager::length(MailQueuePtr list)
104 {
105 MailQueuePtr p = list;
106 MailQueuePtr q = p;
107 int i = 0;
108
109 while(p) {
110 i++;
111 p=p->next;
112 if (i%2==0) {
113 q = q->next;
114 }
115 if (p==q)
116 return -1; // means loop
117 }
118 return i;
119 }
120
121 int
122 MailManager::find(MailQueuePtr q,MailQueuePtr list)
123 {
124 MailQueuePtr p = list;
125 while(p) {
126 if (p==q)
127 return -1;
128 p = p->next;
129 }
130 return 0;
131 } 59 }
132 60
133 /* end */ 61 /* end */