46
|
1 #include <stdio.h>
|
|
2 #include <stdlib.h>
|
63
|
3 #include "TaskManagerImpl.h"
|
46
|
4 #include "HTaskInfo.h"
|
|
5
|
|
6 HTaskInfo::HTaskInfo(void)
|
|
7 :htaskPool(NULL), freeHTask(NULL) {}
|
|
8
|
|
9 HTaskInfo::~HTaskInfo(void) { destroy(); }
|
|
10
|
|
11 int
|
|
12 HTaskInfo::init(int num)
|
|
13 {
|
|
14 if (htaskPool == NULL) {
|
|
15 return extend_pool(num);
|
|
16 }
|
|
17 return 0;
|
|
18 }
|
|
19
|
|
20 /**
|
|
21 * Fix me
|
|
22 * extend できる限界を設定するべき?
|
|
23 */
|
|
24 int
|
|
25 HTaskInfo::extend_pool(int num)
|
|
26 {
|
|
27 HTaskPtr q = NULL;
|
|
28
|
|
29 q = (HTaskPtr)malloc(sizeof(HTask)*(num+1));
|
|
30
|
|
31 if (q == NULL) {
|
|
32 return -1;
|
|
33 }
|
|
34 q->next = htaskPool;
|
|
35 htaskPool = q;
|
|
36
|
|
37 /* Connect all free queue in the pool */
|
|
38 for (q = htaskPool + 1; --num > 0; q++) {
|
|
39 q->next = q + 1;
|
109
|
40 q->inData = (ListDataPtr)malloc(sizeof(ListData));
|
|
41 q->outData = (ListDataPtr)malloc(sizeof(ListData));
|
46
|
42 }
|
|
43 q->next = freeHTask;
|
109
|
44 q->inData = (ListDataPtr)malloc(sizeof(ListData));
|
|
45 q->outData = (ListDataPtr)malloc(sizeof(ListData));
|
|
46
|
46
|
47 freeHTask = htaskPool + 1;
|
|
48
|
|
49 return 0;
|
|
50 }
|
|
51
|
109
|
52 /**
|
|
53 * Task をプールから取って来て返す
|
|
54 *
|
|
55 * @param [cmd] タスクコマンド
|
|
56 */
|
46
|
57 HTaskPtr
|
109
|
58 HTaskInfo::create(int cmd)
|
46
|
59 {
|
|
60 HTaskPtr q;
|
|
61
|
|
62 if (freeHTask == NULL) {
|
|
63 extend_pool(100);
|
|
64 }
|
|
65
|
|
66 q = freeHTask;
|
|
67 freeHTask = freeHTask->next;
|
|
68
|
|
69 q->command = cmd;
|
109
|
70 q->inData->clear();
|
|
71 q->outData->clear();
|
|
72 q->self = (unsigned int)q;
|
|
73 q->param_size = 0;
|
|
74
|
46
|
75 q->wait_me = NULL;
|
|
76 q->wait_i = NULL;
|
|
77 q->post_func = NULL;
|
63
|
78 q->mimpl = NULL;
|
65
|
79 q->cpu_type = CPU_PPE;
|
46
|
80
|
|
81 return q;
|
|
82 }
|
|
83
|
|
84 void
|
|
85 HTaskInfo::free(HTaskPtr q)
|
|
86 {
|
|
87 q->next = freeHTask;
|
|
88 freeHTask = q;
|
|
89 }
|
|
90
|
|
91 void
|
|
92 HTaskInfo::destroy(void)
|
|
93 {
|
109
|
94 HTaskPtr q, tmp;
|
46
|
95
|
109
|
96 #if 1
|
|
97 q = htaskPool;
|
|
98 while (q) {
|
|
99 tmp = q->next;
|
|
100 free(q);
|
|
101 q = tmp;
|
|
102 }
|
|
103 #else
|
46
|
104 for (q = htaskPool; q; q = q->next) {
|
|
105 free(q);
|
|
106 }
|
109
|
107 #endif
|
|
108
|
46
|
109 freeHTask = htaskPool = NULL;
|
|
110 }
|