changeset 646:ffcc25c7c566

send_mailList fix.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 21 Nov 2009 11:20:29 +0900
parents 07bd86a352eb
children 7c9ded1ea750 d0b8860c17f8
files TaskManager/ChangeLog
diffstat 1 files changed, 50 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/ChangeLog	Sat Nov 21 11:18:49 2009 +0900
+++ b/TaskManager/ChangeLog	Sat Nov 21 11:20:29 2009 +0900
@@ -1,41 +1,58 @@
 2009-11-20 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-mail_sendQueue の実装がだめ。こういう実装をすると、queue の
-正しさを関数の中に閉じ込められない。なんか、無限リストにな
-っているらしい。参照が、渡り歩いているどこかの場所でダメに
-なっているらしい。
-
-実際、mail_sendQueue は、free list に置き換わってしまう。
-これまで、これがおかしならなかった理由は不明。
-
-connector に外から手を入れないで、ちゃんとfunction callするべし。
+    mail_sendQueue の実装がだめ。こういう実装をすると、queue の
+    正しさを関数の中に閉じ込められない。なんか、無限リストにな
+    っているらしい。参照が、渡り歩いているどこかの場所でダメに
+    なっているらしい。
+
+    実際、mail_sendQueue は、free list に置き換わってしまう。
+    これまで、これがおかしならなかった理由は不明。
+
+    connector に外から手を入れないで、ちゃんとfunction callするべし。
+
+    わかりました。
+        if (list) {
+            ...
+            mainScheduler->send_mailList(in_mail_list);
+        }
+        out_mail_list = mainScheduler->recv_mailList();
+
+    としてしまったが、recv_mailList() でなく、send_mailList で、
+    mail_sendQueue をクリアしていたので、
+        } else {
+            mainScheduler->send_mailList(in_mail_list);
+        }
+    とする必要があったらしい。if (list) を入れたせいで、こうなった。
+    でも、当然、recv_mailList() で clear するべき。atomicity の意味でも。
+    なので、send_mailList() での clear は必要ない。
+
 
 2009-11-19 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-finish_task を全員が待つ設定で、finish_task を終了判定に
-使っている。それだと、すべてのtaskが、finish_task のwait queue
-を*必ず*触りにいってしまう。
-
-finish_task への待ちを取り除くと、CellTaskManagerImpl::run()
-が、
-    do {
-	ppeMail = ppeManager->schedule(ppeTaskList);
-	    cont:
-	ppeTaskList = mail_check(ppeMail);
-    } while (ppeTaskList);
-とかやっているので、ここで抜けてしまう。
-
-要するに、SPUの状態を見て、running がなくなるのを調べるべき
-なんだが、SpeTheads は「一つしかない」らしい。spe_running 
-で、走っているものがあるかどうか見るか?
-
-Cell だと、MainScheduler と FifoScheduler の二種類の
-スケジューラがあるのか。
-
-     MainScheduler --- task list -----> FifoScheduler
-     MainScheduler <-- finish task ---- FifoScheduler
-
-というわけね。
+    finish_task を全員が待つ設定で、finish_task を終了判定に
+    使っている。それだと、すべてのtaskが、finish_task のwait queue
+    を*必ず*触りにいってしまう。
+
+    finish_task への待ちを取り除くと、CellTaskManagerImpl::run()
+    が、
+	do {
+	    ppeMail = ppeManager->schedule(ppeTaskList);
+		cont:
+	    ppeTaskList = mail_check(ppeMail);
+	} while (ppeTaskList);
+    とかやっているので、ここで抜けてしまう。
+
+    要するに、SPUの状態を見て、running がなくなるのを調べるべき
+    なんだが、SpeTheads は「一つしかない」らしい。spe_running 
+    で、走っているものがあるかどうか見るか?
+
+    Cell だと、MainScheduler と FifoScheduler の二種類の
+    スケジューラがあるのか。
+
+	 MainScheduler --- task list -----> FifoScheduler
+	 MainScheduler <-- finish task ---- FifoScheduler
+
+    というわけね。
 
 2009-11-15 Shinji KONO <kono@ie.u-ryukyu.ac.jp>