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