diff TaskManager/kernel/ppe/TaskManagerImpl.cc @ 499:eacbcdb23986

still fixing...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 11 Oct 2009 15:42:00 +0900
parents cb5ecfc5aaa3
children 735f76483bb2
line wrap: on
line diff
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc	Sun Oct 11 11:46:41 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc	Sun Oct 11 15:42:00 2009 +0900
@@ -26,7 +26,7 @@
  * 番兵的な意味で実装
  */
 void
-TaskManagerImpl::systask_init(void)
+TaskManagerImpl::systask_init()
 {
     systask_register();
 
@@ -39,7 +39,7 @@
     //   systask_finish->wait_for(systask_finish);
     // とかなって無限ループになるので、
     // これだけは明示的に append_waitTask() で
-    append_waitTask(systask_start);
+    append_waitTask(systask_finish);
 }
 
 HTaskPtr
@@ -121,8 +121,13 @@
 void
 TaskManagerImpl::check_task_finish(HTaskPtr me)
 {
+    // post_func を先に実行しないと、systask_finish が active_queue
+    // 移されてから、wait_for されるという事態が起きることがある。
+
+    me->post_func(me->post_arg);
+
     while(TaskQueue *p = me->wait_me->poll()) {
-	HTaskPtr you = (HTaskPtr)p->task;
+	HTaskPtr you = p->task;
 	TaskQueueInfo *wait_i = you->wait_i;
 	// 相手の wait queue から自分(を指しているTaskQueue)を削除
 	wait_i->remove(p->waiter);
@@ -130,14 +135,13 @@
 	wait_i->free_(p->waiter);
 
 	if (wait_i->empty()) {
-	    waitTaskQueue->remove((HTaskPtr)you->task);
-	    append_activeTask((HTaskPtr)you->task);
+	    waitTaskQueue->remove(you);
+	    append_activeTask(you);
 	}
 
 	wait_i->free_(p);
     }
 
-    me->post_func(me->post_arg);
     htaskImpl->free_(me);
 }
 
@@ -153,7 +157,7 @@
  * activeQueue へ移す
  */
 void
-TaskManagerImpl::wakeup_waitTask(void)
+TaskManagerImpl::wakeup_waitTask()
 {
   // done in check_task_finish   
 }