changeset 370:4435c9990988

change TaskManger & memory/* & Random
author aaa
date Wed, 29 Jul 2009 15:09:36 +0900
parents 03ae2929c931
children f88744ee9350
files TaskManager/kernel/memory/MemList.cc TaskManager/kernel/memory/MemList.h TaskManager/kernel/memory/MemorySegment.h TaskManager/kernel/ppe/Random.cc TaskManager/kernel/ppe/TaskManager.cc example/MemList/main.cc
diffstat 6 files changed, 98 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/kernel/memory/MemList.cc	Tue Jul 28 19:42:59 2009 +0900
+++ b/TaskManager/kernel/memory/MemList.cc	Wed Jul 29 15:09:36 2009 +0900
@@ -42,18 +42,55 @@
 MemList::remove(MemorySegment* e)
 {
     e->prev->next = e->next;
-    if (e->next != NULL) {
-	e->next->prev = e->prev;
+    e->next->prev = e->prev;
+
+    if (first->next == e) {
+	first->next = e->next;
     }
+    if (last == e) {
+	last = e->prev;
+    }
+
     e->prev = NULL;
     e->next = NULL;
 
     return 1;
 }
 
+/*!
+  リストの先頭を取得および削除する。リストが空の場合は NULL を返す。
+ */
+
+MemorySegment*
+MemList::poll()
+{
+    MemorySegment* e = first->next;
+    if (e == this) {
+	return NULL;
+    }
+    remove(e);
+    return e;
+}
+
 void
 MemList::moveToFirst(MemorySegment* e)
 {
     remove(e);
     addFirst(e);
 }
+
+/*!
+  リスト内の指定された位置にある要素を返す。
+  要素数を超えた位置を指定した場合 NULL を返す。
+ */
+
+MemorySegment*
+MemList::get(int index)
+{
+    MemorySegment* e = first->next;
+    for (int i = 0; i < index; i++) {
+	if (e == this) return NULL;
+	e = e->next;
+    }
+    return e;
+}
--- a/TaskManager/kernel/memory/MemList.h	Tue Jul 28 19:42:59 2009 +0900
+++ b/TaskManager/kernel/memory/MemList.h	Wed Jul 29 15:09:36 2009 +0900
@@ -1,19 +1,25 @@
 #ifndef MEMLIST
 #define MEMLIST
 
+#include <stdlib.h>
 #include "MemorySegment.h"
 
-class MemList {
+class MemList : MemorySegment {
 public:
+    MemorySegment* pool;
     MemorySegment* first;
     MemorySegment* last;
     
     // TaskManager 側で create する
     //MemList* createMemList(uint32 size, uint32 count);
     MemList(MemorySegment* ms) {
-	first = last = ms;
-	ms->next = ms;
-	ms->prev = ms;
+	first = last = this;
+	next = prev = this;
+	pool = ms;
+    }
+
+    ~MemList() {
+	free(pool);
     }
 
     void addFirst(MemorySegment* e);
@@ -21,7 +27,9 @@
     MemorySegment* getFirst();
     MemorySegment* getLast();
     int remove(MemorySegment* e);
+    MemorySegment* poll();
     void moveToFirst(MemorySegment* e); // or use();    
+    MemorySegment* get(int index);
 };
 
 #endif
--- a/TaskManager/kernel/memory/MemorySegment.h	Tue Jul 28 19:42:59 2009 +0900
+++ b/TaskManager/kernel/memory/MemorySegment.h	Wed Jul 29 15:09:36 2009 +0900
@@ -7,8 +7,8 @@
     MemorySegment* next;
     MemorySegment* prev;
     uint32 size;
-    uint32 address;
-    uint32 dummy;
+    memaddr address;
+    void* data;
 };
 
 #endif
--- a/TaskManager/kernel/ppe/Random.cc	Tue Jul 28 19:42:59 2009 +0900
+++ b/TaskManager/kernel/ppe/Random.cc	Wed Jul 29 15:09:36 2009 +0900
@@ -2,6 +2,7 @@
 #include <stdlib.h>
 #include <sys/time.h>
 #include "Random.h"
+#define HAS_SRANDOMDEV 1
 
 /**
  * /dev/urandom, random から取得した値を seed として使う
@@ -22,6 +23,7 @@
 void
 Random::reset(void)
 {
+#if HAS_SRANDOMDEV    
     FILE *fp;
     unsigned int seed;
     struct timeval tv;
@@ -45,8 +47,15 @@
     }
 
     srandom(seed);
+#else
+    srandomdev();
+#endif
 }
 
+/*!
+  1 から 2^(32-1) のランダムな数値を返す。
+ */
+
 int
 Random::getData(void)
 {
--- a/TaskManager/kernel/ppe/TaskManager.cc	Tue Jul 28 19:42:59 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskManager.cc	Wed Jul 29 15:09:36 2009 +0900
@@ -100,11 +100,12 @@
     char* mseg = (char*)m_impl->allocate(seg_size*count);
     MemList* mlist = new MemList((MemorySegment*)mseg);
 
-    for(uint32 i = 1; i < count; i++) {
+    for(uint32 i = 0; i < count; i++) {
 	MemorySegment* next = (MemorySegment*)(mseg+seg_size*i);
+	char* data = (char*)next+head_size;
+	next->data = (void*)data;
 	mlist->addLast(next);
     }
 
     return mlist;
 }
-
--- a/example/MemList/main.cc	Tue Jul 28 19:42:59 2009 +0900
+++ b/example/MemList/main.cc	Wed Jul 29 15:09:36 2009 +0900
@@ -1,6 +1,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <assert.h>
+#include <strings.h>
 #include "TaskManager.h"
 #include "Func.h"
 #include "MemList.h"
@@ -14,23 +16,47 @@
   -cpu    Number of SPE (default 1) \n				      \
   -count  Number of task is print \"Hello, World!!\"";
 
-// get のテストとか
+void
+test1(MemList* active, MemList* freelist, uint32 size, uint32 count)
+{
+/*!
+  active からランダムに要素を取り出してそこの size の領域を書き潰す
+  そこを moveToFirst を繰り返すテスト
+ */ 
+    for (uint32 i = 0; i < count; i++) {
+	int index = manager->get_random()%count;
+	MemorySegment* e = active->get(index);
+	active->moveToFirst(e);
+	bzero(e->data, size);
+    }
+    printf("test1\n");    
+}
 
 int
 TMmain(int argc, char *argv[])
 {
-
-    printf("test\n");
     uint32 size = 128;
-    uint32 count = 64;
-    
+    uint32 count = 64;    
     
     MemList* active = manager->createMemList(size, 0);
     MemList* freelist = manager->createMemList(size, count);
     
     // 配列!
-    MemorySegment* e;
-    active->addFirst(e);    
+    uint32 i = 0;
+    for (;; i++) {
+	MemorySegment* m = freelist->poll();
+	if (m == 0) {
+	    break;
+	}
+	active->addFirst(m);
+    }
+
+    assert(i==count);
+    printf("count = %d\n", i);
+
+    test1(active, freelist, size, count);
+    delete active;
+    delete freelist;
     
     return 0;
 }