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()
 {