annotate TaskManager/kernel/ppe/TaskManagerImpl.cc @ 945:a9c7784e5dae

sort example fix ( simple task accepts one param and more compatible with old task)
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 01 Aug 2010 19:29:27 +0900
parents 0c11c2fd7e63
children 86aea6affe6c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5
75f184d16fa5 *** empty log message ***
gongo
parents: 3
diff changeset
1 #include <stdio.h>
3
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
2 #include "TaskManagerImpl.h"
46
f154d9d07a42 *** empty log message ***
gongo
parents: 42
diff changeset
3 #include "types.h"
f154d9d07a42 *** empty log message ***
gongo
parents: 42
diff changeset
4 #include "error.h"
518
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
5 #include "SchedTask.h"
619
0decff4e867b RenewTask removal
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 567
diff changeset
6 #include "Scheduler.h"
634
0558abba673c SimpleTask start
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
7 #include "SysTask.h"
0558abba673c SimpleTask start
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
8 #include "SysFunc.h"
801
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
9 #include <string.h>
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
10
619
0decff4e867b RenewTask removal
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 567
diff changeset
11
220
gongo@localhost.localdomain
parents: 115
diff changeset
12 static HTaskPtr systask_start;
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
13 static HTaskPtr systask_finish;
42
aa11038dbdc1 *** empty log message ***
gongo
parents: 18
diff changeset
14
514
2659376067e8 old ball_bound fix...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
15 static void
2659376067e8 old ball_bound fix...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 507
diff changeset
16 noaction(SchedTask *s, void *read, void *write)
3
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
17 {
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
18 }
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
19
835
yutaka@localhost.localdomain
parents: 832
diff changeset
20 TaskManagerImpl::TaskManagerImpl(int num)
yutaka@localhost.localdomain
parents: 832
diff changeset
21 : machineNum(num){
853
game@zeus.cr.ie.u-ryukyu.ac.jp
parents: 835
diff changeset
22 // 実行可能なHTaskのリスト
498
cb5ecfc5aaa3 double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 497
diff changeset
23 activeTaskQueue = new HTaskInfo();
853
game@zeus.cr.ie.u-ryukyu.ac.jp
parents: 835
diff changeset
24 // wait_forで止まっているHTaskのリスト。必要ないが、Dead lock detection に使う
498
cb5ecfc5aaa3 double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 497
diff changeset
25 waitTaskQueue = new HTaskInfo();
853
game@zeus.cr.ie.u-ryukyu.ac.jp
parents: 835
diff changeset
26 // HTask の factory. HTaskInfo ならなんでもいい。
498
cb5ecfc5aaa3 double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 497
diff changeset
27 htaskImpl = waitTaskQueue ; // any HTaskInfo
853
game@zeus.cr.ie.u-ryukyu.ac.jp
parents: 835
diff changeset
28 // Task の dependency を表現する double linked list. HTaskInfo とは別に必要。
498
cb5ecfc5aaa3 double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 497
diff changeset
29 taskQueueImpl = new TaskQueueInfo();
480
46464727d825 TaskQueueInfo initiaization...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 479
diff changeset
30 }
50
7927e00fb8e2 *** empty log message ***
gongo
parents: 48
diff changeset
31
220
gongo@localhost.localdomain
parents: 115
diff changeset
32 /**
298
58fd16298954 from EUC to UTF-8
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 220
diff changeset
33 * 一番最初に PPE で実行される systask_start
220
gongo@localhost.localdomain
parents: 115
diff changeset
34 */
42
aa11038dbdc1 *** empty log message ***
gongo
parents: 18
diff changeset
35 void
499
eacbcdb23986 still fixing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 498
diff changeset
36 TaskManagerImpl::systask_init()
42
aa11038dbdc1 *** empty log message ***
gongo
parents: 18
diff changeset
37 {
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
38 systask_register();
897
ad95be23c794 add return address in SimpleTask for debugging.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 855
diff changeset
39 systask_start = create_task(StartTask,0,0,0,0,__builtin_return_address(0));
ad95be23c794 add return address in SimpleTask for debugging.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 855
diff changeset
40 systask_finish = create_task(FinishTask,0,0,0,0,__builtin_return_address(0));
220
gongo@localhost.localdomain
parents: 115
diff changeset
41
gongo@localhost.localdomain
parents: 115
diff changeset
42 systask_start->spawn();
gongo@localhost.localdomain
parents: 115
diff changeset
43
634
0558abba673c SimpleTask start
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
44 // すべての Task が FinishTask を wait_for すると、
0558abba673c SimpleTask start
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
45 // あらゆる Task が FinishTask の waiting task queue を操作する
0558abba673c SimpleTask start
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
46 // ことになる。それは、重すぎる。PPE/SPE Task が終了した時点で、
0558abba673c SimpleTask start
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
47 // TaskManager が実行する方が安い。
0558abba673c SimpleTask start
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
48 // append_waitTask(systask_finish);
0558abba673c SimpleTask start
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
49 }
0558abba673c SimpleTask start
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
50
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
51 /**
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
52 * Create Simple Task
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
53 */
634
0558abba673c SimpleTask start
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
54 HTaskPtr
897
ad95be23c794 add return address in SimpleTask for debugging.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 855
diff changeset
55 TaskManagerImpl::create_task(int cmd,memaddr rbuf, long r_size, memaddr wbuf, long w_size, void *from) {
634
0558abba673c SimpleTask start
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
56 HTaskPtr new_task;
0558abba673c SimpleTask start
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
57
0558abba673c SimpleTask start
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
58 new_task = htaskImpl->create(cmd, rbuf, r_size, wbuf, w_size);
0558abba673c SimpleTask start
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
59 new_task->post_func = noaction;
0558abba673c SimpleTask start
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
60 new_task->mimpl = this;
897
ad95be23c794 add return address in SimpleTask for debugging.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 855
diff changeset
61 new_task->from = (memaddr)from;
634
0558abba673c SimpleTask start
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
62
0558abba673c SimpleTask start
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 619
diff changeset
63 return new_task;
42
aa11038dbdc1 *** empty log message ***
gongo
parents: 18
diff changeset
64 }
aa11038dbdc1 *** empty log message ***
gongo
parents: 18
diff changeset
65
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
66 /**
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
67 * Create Compatible Task (TaskArray1)
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
68 */
3
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
69 HTaskPtr
897
ad95be23c794 add return address in SimpleTask for debugging.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 855
diff changeset
70 TaskManagerImpl::create_task(int cmd,void *from)
3
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
71 {
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
72 HTaskPtr new_task;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
73
703
61b59376aec5 compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 664
diff changeset
74 // for compatibility
61b59376aec5 compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 664
diff changeset
75 new_task = htaskImpl->create(TaskArray1);
61b59376aec5 compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 664
diff changeset
76 new_task->post_func = noaction;
61b59376aec5 compatibility
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 664
diff changeset
77 new_task->mimpl = this;
736
31d0a5baafdf cut printf
hiroki@localhost.localdomain
parents: 719
diff changeset
78 new_task->create_task_array(cmd,1,8,8,8);
713
f725c6455d19 remove SIMPLE_TASK conditional
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 704
diff changeset
79 // rbuf, r_size were set
704
6d497c098455 Compatibility mode works.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 703
diff changeset
80 new_task->command = TaskArray1;
897
ad95be23c794 add return address in SimpleTask for debugging.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 855
diff changeset
81 new_task->from = (memaddr)from;
63
54355e641172 *** empty log message ***
gongo
parents: 58
diff changeset
82
3
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
83 return new_task;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
84 }
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
85
945
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
86 /**
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
87 * Create Task Array
a9c7784e5dae sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 941
diff changeset
88 */
800
2708c4a7bade run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 736
diff changeset
89 HTaskPtr
897
ad95be23c794 add return address in SimpleTask for debugging.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 855
diff changeset
90 TaskManagerImpl::create_task_array(int id, int num_task, int num_param, int num_inData, int num_outData, void *from)
800
2708c4a7bade run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 736
diff changeset
91 {
897
ad95be23c794 add return address in SimpleTask for debugging.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 855
diff changeset
92 HTaskPtr ta = create_task(TaskArray,0,0,0,0, from);
800
2708c4a7bade run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 736
diff changeset
93 ta->create_task_array(id, num_task, num_param, num_inData, num_outData) ;
2708c4a7bade run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 736
diff changeset
94 return ta;
2708c4a7bade run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 736
diff changeset
95 }
2708c4a7bade run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 736
diff changeset
96
3
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
97 /**
298
58fd16298954 from EUC to UTF-8
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 220
diff changeset
98 * task の依存関係を設定
58fd16298954 from EUC to UTF-8
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 220
diff changeset
99 * master task が終わってから、slave task を実行するように
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
100 * master->wait_for(slave);
3
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
101 */
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
102 void
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
103 TaskManagerImpl::set_task_depend(HTaskPtr master, HTaskPtr slave)
519
5c76db2a07fa continue..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 518
diff changeset
104 {
3
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
105 TaskQueuePtr m, s;
941
0c11c2fd7e63 add no_auto_free flag on HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 940
diff changeset
106 if (!master->self) return;
519
5c76db2a07fa continue..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 518
diff changeset
107
475
e083c4ff91c1 BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 373
diff changeset
108 m = taskQueueImpl->create(master);
e083c4ff91c1 BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 373
diff changeset
109 s = taskQueueImpl->create(slave);
519
5c76db2a07fa continue..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 518
diff changeset
110
479
5bda98b0b56d Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 475
diff changeset
111 master->wait_me->addLast(s);
5bda98b0b56d Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 475
diff changeset
112 slave->wait_i->addLast(m);
481
4896dffad67c Double linked list modification done (tested on Mac OS X)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 480
diff changeset
113 s->waiter = m;
519
5c76db2a07fa continue..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 518
diff changeset
114 }
5c76db2a07fa continue..
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 518
diff changeset
115
3
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
116 /**
298
58fd16298954 from EUC to UTF-8
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 220
diff changeset
117 * タスクを実行可能キューまたは待機キューへ追加する。
58fd16298954 from EUC to UTF-8
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 220
diff changeset
118 * 依存関係が満たされていれば active, まだだったら wait へ。
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
119 * task->spawn();
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
120 */
3
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
121 void
18
0c9341da4522 *** empty log message ***
gongo
parents: 5
diff changeset
122 TaskManagerImpl::spawn_task(HTaskPtr task)
3
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
123 {
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
124 // waiter // master
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
125 // waitee // slave
480
46464727d825 TaskQueueInfo initiaization...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 479
diff changeset
126 if (task->wait_i->empty()) {
498
cb5ecfc5aaa3 double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 497
diff changeset
127 append_activeTask(task);
3
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
128 } else {
498
cb5ecfc5aaa3 double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 497
diff changeset
129 append_waitTask(task);
3
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
130 }
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
131 }
42
aa11038dbdc1 *** empty log message ***
gongo
parents: 18
diff changeset
132
800
2708c4a7bade run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 736
diff changeset
133
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
134 /**
298
58fd16298954 from EUC to UTF-8
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 220
diff changeset
135 * Task を実行可能キューに追加する
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
136 */
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
137 void
498
cb5ecfc5aaa3 double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 497
diff changeset
138 TaskManagerImpl::append_activeTask(HTaskPtr q)
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
139 {
479
5bda98b0b56d Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 475
diff changeset
140 activeTaskQueue->addLast(q);
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
141 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
142
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
143 /**
298
58fd16298954 from EUC to UTF-8
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 220
diff changeset
144 * タスクが実行する CPU を選択する
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
145 *
298
58fd16298954 from EUC to UTF-8
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 220
diff changeset
146 * 現在は CPU_PPE, CPU_SPE, SPE_ANY, SPE_0, SPE_1, ..., SPE_5
58fd16298954 from EUC to UTF-8
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 220
diff changeset
147 * types.h に書いてます。
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
148 */
65
519d24aa7ac8 *** empty log message ***
gongo
parents: 63
diff changeset
149 void
519d24aa7ac8 *** empty log message ***
gongo
parents: 63
diff changeset
150 TaskManagerImpl::set_task_cpu(HTaskPtr task, CPU_TYPE type)
519d24aa7ac8 *** empty log message ***
gongo
parents: 63
diff changeset
151 {
664
7405d92733a8 word count
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
152 if (machineNum==0)
7405d92733a8 word count
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
153 task->cpu_type = CPU_PPE ;
7405d92733a8 word count
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
154 else
7405d92733a8 word count
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
155 task->cpu_type = type;
65
519d24aa7ac8 *** empty log message ***
gongo
parents: 63
diff changeset
156 }
519d24aa7ac8 *** empty log message ***
gongo
parents: 63
diff changeset
157
940
0d404f6c36a8 unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 939
diff changeset
158 #if 0
0d404f6c36a8 unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 939
diff changeset
159 static void
0d404f6c36a8 unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 939
diff changeset
160 check_wait(TaskManagerImpl *tm, TaskQueueInfo *wait_i) {
0d404f6c36a8 unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 939
diff changeset
161 for(TaskQueue *t = wait_i->getFirst(); t; t = wait_i->getNext(t)) {
0d404f6c36a8 unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 939
diff changeset
162 if (!tm->waitTaskQueue->find(t->task)) {
0d404f6c36a8 unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 939
diff changeset
163 printf("stray waiting task%d %lx\n",t->task->command, (long)t->task);
0d404f6c36a8 unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 939
diff changeset
164 } else if (tm->activeTaskQueue->find(t->task)) {
0d404f6c36a8 unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 939
diff changeset
165 printf(" active task%d in waiting queue %lx\n",t->task->command, (long)t->task);
0d404f6c36a8 unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 939
diff changeset
166 } else
0d404f6c36a8 unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 939
diff changeset
167 printf(".");
0d404f6c36a8 unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 939
diff changeset
168 }
0d404f6c36a8 unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 939
diff changeset
169 }
0d404f6c36a8 unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 939
diff changeset
170 #endif
0d404f6c36a8 unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 939
diff changeset
171
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
172 /**
830
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
173 * @brief 終了したタスクから依存の処理とか
298
58fd16298954 from EUC to UTF-8
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 220
diff changeset
174 * post_func() はこのタスクが終了したら実行する関数。
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
175 *
298
58fd16298954 from EUC to UTF-8
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 220
diff changeset
176 * @param [task] 終了したタスク
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
177 */
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
178 void
647
7c9ded1ea750 MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 639
diff changeset
179 TaskManagerImpl::check_task_finish(HTaskPtr me, HTaskInfo *wait_queue)
42
aa11038dbdc1 *** empty log message ***
gongo
parents: 18
diff changeset
180 {
497
9d225ba0c34f no wakeup loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 496
diff changeset
181 while(TaskQueue *p = me->wait_me->poll()) {
499
eacbcdb23986 still fixing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 498
diff changeset
182 HTaskPtr you = p->task;
497
9d225ba0c34f no wakeup loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 496
diff changeset
183 TaskQueueInfo *wait_i = you->wait_i;
479
5bda98b0b56d Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 475
diff changeset
184 // 相手の wait queue から自分(を指しているTaskQueue)を削除
5bda98b0b56d Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 475
diff changeset
185 wait_i->remove(p->waiter);
5bda98b0b56d Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 475
diff changeset
186 // queue を free する
493
dd091fe6128e fix free conflict.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 483
diff changeset
187 wait_i->free_(p->waiter);
483
0b933bef0328 renew task worked. but not test_nogl...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 481
diff changeset
188
497
9d225ba0c34f no wakeup loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 496
diff changeset
189 if (wait_i->empty()) {
647
7c9ded1ea750 MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 639
diff changeset
190 wait_queue->remove(you);
499
eacbcdb23986 still fixing...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 498
diff changeset
191 append_activeTask(you);
497
9d225ba0c34f no wakeup loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 496
diff changeset
192 }
9d225ba0c34f no wakeup loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 496
diff changeset
193
940
0d404f6c36a8 unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 939
diff changeset
194 wait_i->free_(p); // p->wait_i, p->wait_me は再利用される
479
5bda98b0b56d Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 475
diff changeset
195 }
5bda98b0b56d Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 475
diff changeset
196
939
9cfac2e8fc2e loop detection.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 897
diff changeset
197 // me を誰かが持っていて、me が finish した後に、
9cfac2e8fc2e loop detection.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 897
diff changeset
198 // me->wait_for(i) とか、やられると気まずい。
9cfac2e8fc2e loop detection.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 897
diff changeset
199 // 特に、me が他人に再利用されていると。そういう時には、
9cfac2e8fc2e loop detection.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 897
diff changeset
200 // このfreeをコメントアウトしてみる。
9cfac2e8fc2e loop detection.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 897
diff changeset
201
9cfac2e8fc2e loop detection.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 897
diff changeset
202 // id かななんかでチェックした方が良いが...
9cfac2e8fc2e loop detection.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 897
diff changeset
203
9cfac2e8fc2e loop detection.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 897
diff changeset
204 me->self = 0;
941
0c11c2fd7e63 add no_auto_free flag on HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 940
diff changeset
205 if (!me->flag.no_auto_free)
0c11c2fd7e63 add no_auto_free flag on HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 940
diff changeset
206 htaskImpl->free_(me);
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
207 }
42
aa11038dbdc1 *** empty log message ***
gongo
parents: 18
diff changeset
208
830
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
209 /**
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
210 * @brief 終了したタスクリストの依存の処理
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
211 * @param [task] 終了したタスク
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
212 */
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
213 void
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
214 TaskManagerImpl::check_task_list_finish(SchedTask *s, TaskListPtr list, HTaskInfo *wait_queue)
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
215 {
855
e2af25174a05 light fix--
Yutaka_Kinjyo
parents: 853
diff changeset
216 for(int i = 0;i<list->length;i++) {
831
65e9eab53f50 CheckTaskList Mail working
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 830
diff changeset
217 SimpleTaskPtr task = &list->tasks[i];
830
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
218 HTask *me = (HTask*)task->self;
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
219 me->post_func(s, me->post_arg1, me->post_arg2);
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
220 if (task->command==TaskArray1) {
831
65e9eab53f50 CheckTaskList Mail working
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 830
diff changeset
221 int next = ((task->r_size)/sizeof(SimpleTask))+1;
830
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
222 // assert(next<list->length);
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
223 i+=next;
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
224 }
832
29094b48d966 poling (may recurse..)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 831
diff changeset
225 s->polling();
830
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
226 check_task_finish(me, wait_queue);
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
227 }
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
228 }
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
229
830
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
230 /**
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
231 * @brief waitTaskqueue への挿入 。必須ではない。
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
232 * 現状では、dead lock 検出にしか使ってない
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
233 *
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
234 * @param [task] 終了したタスク
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
235 */
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
236 void
498
cb5ecfc5aaa3 double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 497
diff changeset
237 TaskManagerImpl::append_waitTask(HTaskPtr q)
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
238 {
479
5bda98b0b56d Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 475
diff changeset
239 waitTaskQueue ->addLast(q);
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
240 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents: 94
diff changeset
241
830
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
242 /**
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
243 @brief htask を DMA でCPUに渡すための TaskList に入れる (copy)
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
244 @param htask
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
245 @param taskList
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
246 TaskList は自動的に延長される
c7905ead974f return TaskList->self
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 809
diff changeset
247 */
801
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
248 void
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
249 TaskManagerImpl::set_taskList(HTaskPtr htask, TaskListInfoPtr taskList) {
809
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 807
diff changeset
250 TaskListPtr list ;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 807
diff changeset
251 if ( taskList->empty() ) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 807
diff changeset
252 list = taskList->create();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 807
diff changeset
253 taskList->addLast(list);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 807
diff changeset
254 } else
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 807
diff changeset
255 list = taskList->getLast();
801
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
256 SimpleTaskPtr task = &list->tasks[list->length++];
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
257 if (htask->command==TaskArray1) {
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
258 // compatibility
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
259 int next = ((htask->r_size)/sizeof(SimpleTask))+1;
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
260 if (list->length+next>=TASK_MAX_SIZE) {
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
261 list->length--;
809
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 807
diff changeset
262 TaskListPtr newList = taskList->create();
801
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
263 taskList->addLast(newList);
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
264 list = newList;
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
265 task = &list->tasks[list->length++];
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
266 }
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
267 Task *array = (Task*)&list->tasks[list->length];
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
268 list->length += next;
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
269 if (list->length>=TASK_MAX_SIZE) {
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
270 perror("task array1 overflow\n");
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
271 }
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
272 memcpy(array, htask->rbuf, htask->r_size);
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
273 free(htask->rbuf);
831
65e9eab53f50 CheckTaskList Mail working
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 830
diff changeset
274 // htask->rbuf = 0; htask->r_size = 0; we need this...
801
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
275 *task = *(SimpleTask*)htask;
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
276 } else {
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
277 *task = *(SimpleTask*)htask;
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
278 }
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
279 if (list->length >= TASK_MAX_SIZE) {
809
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 807
diff changeset
280 TaskListPtr newList = taskList->create();
801
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
281 taskList->addLast(newList);
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
282 list = newList;
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
283 }
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
284 }
974cd68383b3 TaslListInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 800
diff changeset
285
54
90523ccc4dff *** empty log message ***
gongo
parents: 50
diff changeset
286
619
0decff4e867b RenewTask removal
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 567
diff changeset
287
479
5bda98b0b56d Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 475
diff changeset
288 /* end */