comparison TaskManager/kernel/ppe/HTaskInfo.cc @ 109:028ffc9c0375 draft

Cerium cvs version
author gongo@gendarme.local
date Wed, 12 Nov 2008 17:39:33 +0900
parents 504899860e66
children 768452fab95e
comparison
equal deleted inserted replaced
108:6f3b3dd3c095 109:028ffc9c0375
35 htaskPool = q; 35 htaskPool = q;
36 36
37 /* Connect all free queue in the pool */ 37 /* Connect all free queue in the pool */
38 for (q = htaskPool + 1; --num > 0; q++) { 38 for (q = htaskPool + 1; --num > 0; q++) {
39 q->next = q + 1; 39 q->next = q + 1;
40 q->inData = (ListDataPtr)malloc(sizeof(ListData));
41 q->outData = (ListDataPtr)malloc(sizeof(ListData));
40 } 42 }
41 q->next = freeHTask; 43 q->next = freeHTask;
44 q->inData = (ListDataPtr)malloc(sizeof(ListData));
45 q->outData = (ListDataPtr)malloc(sizeof(ListData));
46
42 freeHTask = htaskPool + 1; 47 freeHTask = htaskPool + 1;
43 48
44 return 0; 49 return 0;
45 } 50 }
46 51
52 /**
53 * Task をプールから取って来て返す
54 *
55 * @param [cmd] タスクコマンド
56 */
47 HTaskPtr 57 HTaskPtr
48 //HTaskInfo::create(int cmd, int size, DmaBuffer *in_addr, DmaBuffer *out_addr) 58 HTaskInfo::create(int cmd)
49 HTaskInfo::create(int cmd, int size, unsigned int in_addr, unsigned int out_addr)
50 { 59 {
51 HTaskPtr q; 60 HTaskPtr q;
52 61
53 if (freeHTask == NULL) { 62 if (freeHTask == NULL) {
54 extend_pool(100); 63 extend_pool(100);
56 65
57 q = freeHTask; 66 q = freeHTask;
58 freeHTask = freeHTask->next; 67 freeHTask = freeHTask->next;
59 68
60 q->command = cmd; 69 q->command = cmd;
61 q->in_addr = in_addr; 70 q->inData->clear();
62 q->out_addr = out_addr; 71 q->outData->clear();
63 q->in_size = size; 72 q->self = (unsigned int)q;
73 q->param_size = 0;
74
64 q->wait_me = NULL; 75 q->wait_me = NULL;
65 q->wait_i = NULL; 76 q->wait_i = NULL;
66 q->post_func = NULL; 77 q->post_func = NULL;
67 q->mimpl = NULL; 78 q->mimpl = NULL;
68 q->cpu_type = CPU_PPE; 79 q->cpu_type = CPU_PPE;
78 } 89 }
79 90
80 void 91 void
81 HTaskInfo::destroy(void) 92 HTaskInfo::destroy(void)
82 { 93 {
83 HTaskPtr q; 94 HTaskPtr q, tmp;
84 95
96 #if 1
97 q = htaskPool;
98 while (q) {
99 tmp = q->next;
100 free(q);
101 q = tmp;
102 }
103 #else
85 for (q = htaskPool; q; q = q->next) { 104 for (q = htaskPool; q; q = q->next) {
86 free(q); 105 free(q);
87 } 106 }
107 #endif
108
88 freeHTask = htaskPool = NULL; 109 freeHTask = htaskPool = NULL;
89 } 110 }
90
91
92 /**
93 * manager->set_task_depend(task1, task2); // task2 は task1 の終了を待つ
94 *
95 * ってやるより
96 *
97 * task2->set_depend(task1);
98 *
99 * ってやったほうがわかりやすいよねー的な話し合いで
100 * 下のようなAPIを作りました
101 */
102
103 void
104 HTask::spawn(void)
105 {
106 mimpl->spawn_task(this);
107 }
108
109 void
110 HTask::set_depend(HTaskPtr master)
111 {
112 mimpl->set_task_depend(master, this);
113 }
114
115 void
116 HTask::set_cpu(CPU_TYPE type)
117 {
118 mimpl->set_task_cpu(this, type);
119 }