Mercurial > hg > Members > kono > Cerium
diff TaskManager/kernel/schedule/Scheduler.cc @ 421:cd77224d4224
Code load implementation... (not yet tested)
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 24 Sep 2009 16:04:23 +0900 |
parents | 8611780d479f |
children | 799071db126e |
line wrap: on
line diff
--- a/TaskManager/kernel/schedule/Scheduler.cc Wed Sep 23 21:29:30 2009 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.cc Thu Sep 24 16:04:23 2009 +0900 @@ -325,16 +325,63 @@ return mainMemList[id]; } +/** + * Task load API + */ -/** - * 本当は Scheduler クラスに入れるべきなんだろうか。。。 - * なんか手抜きの感がある - */ -void register_task(int cmd, TaskObjectCreator creator) +static void +load_task(Scheduler *m, int task_id) +{ + MemorySegment *s = m->get_segment( + task_list[task_id].location, + m->code_segment_pool); + task_list[task_id].segment = s; +} + +static void +null_loader(Scheduler *m, int task_id) +{ +} + +static void +wait_load(Scheduler *m, int task_id) +{ + // wait for code segment load + m->wait_segment(task_list[task_id].segment); + // calcurate call address + TaskObjectCreator creator = + (TaskObjectCreator)( + (char*)task_list[task_id].segment->data + + task_list[task_id].entry_offset); + task_list[task_id].creator = creator; +} + +static void +null_waiter(Scheduler *m, int task_id) +{ +} + +extern void +register_task(int cmd, TaskObjectCreator creator) { task_list[cmd].creator = creator; + task_list[cmd].load = null_loader; + task_list[cmd].wait = null_waiter; } +extern void +register_dynamic_task(int cmd, + memaddr start, memaddr end, int entry_offset) +{ + task_list[cmd].creator = 0; + task_list[cmd].location = start; + task_list[cmd].end = end; + task_list[cmd].entry_offset = entry_offset; + task_list[cmd].load = load_task; + task_list[cmd].wait = wait_load; +} + + /*! size 単位のMemory Segment を count 個作る @@ -405,6 +452,7 @@ return s; } + uint32 Scheduler::get_tag() {