# HG changeset patch # User aaa # Date 1248847776 -32400 # Node ID 4435c999098879f47033a0e15aae7c3098945ab5 # Parent 03ae2929c9310b70012e71ae352f9684e98f87f3 change TaskManger & memory/* & Random diff -r 03ae2929c931 -r 4435c9990988 TaskManager/kernel/memory/MemList.cc --- 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; +} diff -r 03ae2929c931 -r 4435c9990988 TaskManager/kernel/memory/MemList.h --- 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 #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 diff -r 03ae2929c931 -r 4435c9990988 TaskManager/kernel/memory/MemorySegment.h --- 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 diff -r 03ae2929c931 -r 4435c9990988 TaskManager/kernel/ppe/Random.cc --- 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 #include #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) { diff -r 03ae2929c931 -r 4435c9990988 TaskManager/kernel/ppe/TaskManager.cc --- 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; } - diff -r 03ae2929c931 -r 4435c9990988 example/MemList/main.cc --- 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 #include #include +#include +#include #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; }