changeset 1175:d7486d6a5e37 draft

minor change
author Yutaka_Kinjyo
date Tue, 07 Jun 2011 17:55:20 +0900
parents 0e826d18f59a
children fc4a96198ed3 5abf0ce8c71c
files Renderer/Engine/task/CreateSpan.cc TaskManager/kernel/memory/AddrList.h TaskManager/kernel/memory/MemIterator.cc TaskManager/kernel/memory/MemIterator.h TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTask.h TaskManager/kernel/schedule/Scheduler.cc TaskManager/kernel/schedule/Scheduler.h
diffstat 8 files changed, 135 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/Renderer/Engine/task/CreateSpan.cc	Tue Jun 07 01:31:03 2011 +0900
+++ b/Renderer/Engine/task/CreateSpan.cc	Tue Jun 07 17:55:20 2011 +0900
@@ -404,12 +404,6 @@
 
 #ifdef USE_SEGMENT
 
-                /*
-                  it = create_iterator(spackList, span_ml);
-                  ms = (MemorySegmentPtr)it->get_ms();
-                  spack = (SpanPackPtr)ms->data;
-
-                 */
 
                 smanager->wait_segment(span_put_ms);
 
@@ -422,6 +416,13 @@
                 prev_index = index;
                 spack = (SpanPackPtr)span_get_ms->data;
 
+
+#elif defined(USE_ITERATOR)
+                
+                ms = it->get_ms();
+                spack = (SpanPackPtr)ms->data;
+                prev_index = index;
+
 #else
 
 		tmp_spack = spack;
@@ -454,7 +455,7 @@
 	     * Segment領域を確保して、それをsegmentのAPIでやり取りするのが嬉しいのかね。
 	     * 
              * mainMem 追い出すには、ちょっと苦労するかも? 
-             * mainMem するかどうかは予想できる。 
+             * mainMem するかどうかは予想できはする。 
 	     */
 
 	    if (spack->info.size >= MAX_SIZE_SPAN) {
@@ -469,12 +470,6 @@
 
 #ifdef USE_SEGMENT
 
-                /*
-                  cur_spack = get_list_cur();
-                  cur_spack = next;
-                  
-                 */
-
                 smanager->wait_segment(span_put_ms);
 
                 span_put_ms = span_get_ms;
@@ -487,6 +482,20 @@
                 spack = (SpanPackPtr)span_get_ms->data;
 		spack->init((index+1)*split_screen_h);
 
+
+#elif defined(USE_ITERATOR)
+
+                /*
+                  next は AddrList に直さないといけない
+                  AddrList next_list = make_list(next);
+                  とかいうAPIか、overwrite_list の中でもいいかもね。
+                 */
+
+                overwrite_list(next_ist);
+                ms = it->get_ms();
+                spack = (SpanPackPtr)ms->data;
+                prev_index = index;
+                
 #else
 
 
@@ -597,6 +606,7 @@
 
 #endif
 
+    // ここで AddrList は作れるかな。 
     int charge_y_top = (long)smanager->get_param(1);
     int charge_y_end = (long)smanager->get_param(2);
 
@@ -612,6 +622,10 @@
  
             pp_ms = smanager->get_segment((memaddr)pp->next, pp_ml);
 
+#elif defined(USE_ITERATOR)
+            
+            
+
 #else
 
 	    smanager->dma_load(next_pp, (memaddr)pp->next,
@@ -625,6 +639,9 @@
 
             pp_ms = NULL;
 
+#elif defined(USE_ITERATOR)
+
+
 #else
 	    next_pp = NULL;
 
@@ -706,6 +723,8 @@
         } else {
             pp = NULL;
         }
+
+#elif defined(USE_ITERATOR)
         
 #else
 
@@ -736,13 +755,14 @@
                         sizeof(SpanPack), SPAN_PACK_STORE);
     smanager->dma_wait(SPAN_PACK_STORE);
 
-
 #endif
 
 #ifdef USE_SEGMENT
 
     // Global でSegmentとったので、いつか解放しないといかないなぁ。
 
+#elif defined(USE_ITERATOR)
+
 #else
 
     free(free_pp);
--- a/TaskManager/kernel/memory/AddrList.h	Tue Jun 07 01:31:03 2011 +0900
+++ b/TaskManager/kernel/memory/AddrList.h	Tue Jun 07 17:55:20 2011 +0900
@@ -13,7 +13,7 @@
 typedef struct AddrList {
 
   memaddr addr;
-  memaddr next;
+  AddrList *next;
 
 }AddrList, *AddrListPtr; // 8
 
--- a/TaskManager/kernel/memory/MemIterator.cc	Tue Jun 07 01:31:03 2011 +0900
+++ b/TaskManager/kernel/memory/MemIterator.cc	Tue Jun 07 17:55:20 2011 +0900
@@ -6,6 +6,9 @@
  * @param [addr_list] main memory 側のアドレスリスト
  * @param [mem_list]  memory segment のリスト
  * @param [cmd] Iterator パターンというべきか. 
+ * 
+ * cmd は、ms, MemList で情報を持っててもできる
+ * 
  */
 
 MemIterator::MemIterator(AddrListPtr addr_list, MemList *mem_list, 
@@ -81,7 +84,7 @@
     exec_ms   = read_ms;
 
     // アドレスをリストから追っていく
-    addr_list = (AddrListPtr)addr_list->next;
+    addr_list = addr_list->next;
 
     // 次必要なものを load し始めておく
     read_ms   = smanager->get_segment(addr_list->addr, mem_list);
@@ -106,7 +109,7 @@
     exec_ms = read_ms;
 
     // アドレスをリストから追っていく
-    addr_list = (AddrListPtr)addr_list->next;
+    addr_list = addr_list->next;
 
 
     // 次必要なものを load し始めておく
@@ -147,7 +150,65 @@
     write_ms = smanager->get_free_segment(addr_list->addr, mem_list);
 
     // アドレスをリストから追っていく
-    addr_list = (AddrListPtr)addr_list->next;
+    addr_list = addr_list->next;
 
     return write_ms;
 }
+
+
+/*
+ * 出しておいた segment 命令を待つ.
+ * まだ、書きこまれていないmsを書きこむ
+ * 最後の締め.
+ */
+
+void
+MemIterator::collect_ms(void)
+{
+    smanager->put_segment(write_ms);
+    smanager->wait_segment(free_ms);
+    smanager->wait_segment(write_ms);
+    smanager->wait_segment(read_ms);
+}
+
+
+/*
+ * 走査中のlistの一部を上書きする.
+ * mainMem (CreateSpan) とかやるとき、使う予定
+ */
+void
+MemIterator::overwrite_list(AddrListPtr list)
+{
+
+    /*
+     * すでに次のリストの read を開始している可能性がある
+     * ので、それをいったん中止、同じ ms に 新しく load をかける。
+     * 
+     * でも、これは write only な場合いらない..
+     */
+
+    // dma命令キャンセルする方法があるかな. 調べてみる. あるならwaitするよりそっちがいい.
+    smanager->wait_segment(read_ms);
+
+    /* segment に直接上書きする機能が必要かも. 要実装.
+     * 指定した ms に load する
+     * この場合は、read_ms に新しく list->addr を load する
+     */
+    smanager->overwrite_segment(read_ms, list->addr);
+
+
+    /*
+     * 現在のaddr_list を新しい list に上書きする
+     */
+    AddrListPtr tmp = list;
+
+    while(list->next) {
+        list = list->next;
+    }
+
+    list->next = addr_list->next;
+    addr_list = tmp;
+
+}
+
+
--- a/TaskManager/kernel/memory/MemIterator.h	Tue Jun 07 01:31:03 2011 +0900
+++ b/TaskManager/kernel/memory/MemIterator.h	Tue Jun 07 17:55:20 2011 +0900
@@ -34,11 +34,18 @@
     MemIterator(AddrListPtr add_list, MemList *mem_list, int cmd, SchedTask *smanager);
     ~MemIterator();
 
+
+    MemorySegmentPtr (MemIterator::*get_ms)(void);
+
     int hasNext(void);
-    MemorySegmentPtr (MemIterator::*get_ms)(void);
+
     MemorySegmentPtr get_read_write_ms(void);
     MemorySegmentPtr get_read_ms(void);
     MemorySegmentPtr get_write_ms(void);
+
+    void collect_ms(void);
+    void overwrite_list(AddrListPtr list);
+
 };
 
 typedef MemIterator *MemIteratorPtr;
--- a/TaskManager/kernel/schedule/SchedTask.cc	Tue Jun 07 01:31:03 2011 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.cc	Tue Jun 07 17:55:20 2011 +0900
@@ -270,6 +270,10 @@
     return scheduler->get_free_segment(addr,m);
 }
 
+void SchedTask::overwrite_segment(MemorySegment *s, memaddr addr) {
+    return scheduler->overwrite_segment(s,addr);
+}
+
 
 void SchedTask::put_segment(MemorySegment *s) {
     scheduler->put_segment(s);
--- a/TaskManager/kernel/schedule/SchedTask.h	Tue Jun 07 01:31:03 2011 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.h	Tue Jun 07 17:55:20 2011 +0900
@@ -66,6 +66,7 @@
 
     MemorySegment * get_segment(memaddr addr, MemList *m);
     MemorySegment * get_free_segment(memaddr addr, MemList *m);
+    void overwrite_segment(MemorySegment *s, memaddr addr);
     uint32 get_tag();
     void put_segment(MemorySegment *s);
     void wait_segment(MemorySegment *s);
--- a/TaskManager/kernel/schedule/Scheduler.cc	Tue Jun 07 01:31:03 2011 +0900
+++ b/TaskManager/kernel/schedule/Scheduler.cc	Tue Jun 07 17:55:20 2011 +0900
@@ -452,6 +452,28 @@
 
 }
 
+/*!
+
+  指定した MemorySegment を上書きする
+
+  @param [s]     上書きするMemorySegment
+  @param [addr]  上書きするdataへのアドレス
+
+ */
+
+void
+Scheduler::overwrite_segment(MemorySegment *s, memaddr addr) 
+{
+
+    if(addr == NULL) {
+        return;
+    }
+
+    s->address = addr;
+    dma_load(s->data, addr, s->size, s->tag);
+
+}
+
 
 MemorySegment * 
 Scheduler::get_segment(memaddr addr, MemList *m, int size) 
--- a/TaskManager/kernel/schedule/Scheduler.h	Tue Jun 07 01:31:03 2011 +0900
+++ b/TaskManager/kernel/schedule/Scheduler.h	Tue Jun 07 17:55:20 2011 +0900
@@ -111,6 +111,7 @@
     MemorySegment * get_segment(memaddr addr, MemList *m);
     MemorySegment * get_segment(memaddr addr, MemList *m, int size);
     MemorySegment * get_free_segment(memaddr addr, MemList *m);
+    void overwrite_segment(MemorySegment *s, memaddr addr);
 
     void allocate_code_segment(int size, int count,struct tbl *table);