Mercurial > hg > Members > kono > Cerium
diff TaskManager/Fifo/FifoTaskManagerImpl.cc @ 721:2b167196cb27
cleanups..
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 19 Dec 2009 12:12:09 +0900 |
parents | cafffff0f45a |
children | 31d0a5baafdf |
line wrap: on
line diff
--- a/TaskManager/Fifo/FifoTaskManagerImpl.cc Sat Dec 19 10:43:19 2009 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc Sat Dec 19 12:12:09 2009 +0900 @@ -9,6 +9,8 @@ #include "SchedNop.h" #include "SysFunc.h" +// static void send_alloc_reply(FifoTaskManagerImpl *tm, int id, MainScheduler *s); + FifoTaskManagerImpl::~FifoTaskManagerImpl() { delete mainScheduler; @@ -71,10 +73,8 @@ } -void FifoTaskManagerImpl::show_profile() { - printf("HEHEHEHEH\n"); -} -void FifoTaskManagerImpl::start_profile() {} +// void FifoTaskManagerImpl::show_profile() {} +// void FifoTaskManagerImpl::start_profile() {} /** * スケジューラに渡す TaskList を取得する。 @@ -144,17 +144,15 @@ { TaskListPtr list; - list = get_runTaskList(); - - do { + while((list = get_runTaskList())) { // list を実行する - schedule(list); - + sendTaskList(list); // ppe scheduler からの mail を調べる mail_check(); - - list = get_runTaskList(); - } while (list); + } + if (!waitTaskQueue->empty()) { + fprintf(stderr,"Dead lock detected\n"); + } } /** @@ -164,20 +162,18 @@ * [Tasklist] -> [番兵] -> scheduler->run を抜ける */ void -FifoTaskManagerImpl::schedule(TaskListPtr list) +FifoTaskManagerImpl::sendTaskList(TaskListPtr list) { - if (list) { - // TaskList のアドレスを送る - mainScheduler->mail_write_from_host((memaddr)list); + // TaskList のアドレスを送る + mainScheduler->mail_write_from_host((memaddr)list); - // EXIT_COMMAND (番兵的な意味で) - // これを読むと、mainScheduler->run() から抜けて来る。 - mainScheduler->mail_write_from_host((memaddr)MY_SPE_COMMAND_EXIT); + // EXIT_COMMAND (番兵的な意味で) + // これを読むと、mainScheduler->run() から抜けて来る。 + mainScheduler->mail_write_from_host((memaddr)MY_SPE_COMMAND_EXIT); - // scheduler は受け取ったメールを元に実行する - // new SchedTaskList(list, mainScheduler) の方が良さそうだけど... - mainScheduler->run(new SchedNop()); - } + // scheduler は受け取ったメールを元に実行する + mainScheduler->run(new SchedNop()); + // すべてのlistを実行するまで戻らない } /** @@ -200,6 +196,11 @@ __debug_ppe("mail_check(): Task List finish\n"); } else if (data == (memaddr)MY_SPE_COMMAND_EXIT) { __debug_ppe("mail_check(): Task List finish COMMAND\n"); + } else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) { + // MY_SPE_COMMAND_MALLOC PPE からのmain memory request + // 本来は呼ばれないはず... + fprintf(stderr, "error: MY_SPE_COMMAND_MALLOC from PPE\n"); + // send_alloc_reply(this, 0, mainScheduler); } else if (data != (memaddr)MY_SPE_NOP) { __debug_ppe("mail_check(): recv from 0x%x\n", data); // post_func を先に実行しないと、systask_finish が active_queue @@ -211,6 +212,30 @@ } } +#if 0 +static void +send_alloc_reply(FifoTaskManagerImpl *tm, int id, MainScheduler *s) +{ + /** + * info[0] = alloc_id; (CellScheduler::mainMem_alloc 参照) + * info[1] = alloc_addr; + */ + memaddr alloc_info[2]; + long alloc_size; + long command; + + alloc_info[0] = s->mail_read_from_host(); + alloc_info[1] = s->mail_read_from_host(); + command = (long)alloc_info[0]; + alloc_size = (long)alloc_info[1]; + + alloc_info[1] = (memaddr)tm->allocate(alloc_size); + + s->mail_write_from_host(alloc_info[0]); + s->mail_write_from_host(alloc_info[1]); +} +#endif + /** * # # # # # # # #