Mercurial > hg > Members > e085722 > Cerium
diff TaskManager/kernel/memory/MemList.cc @ 0:04e28d8d3c6f
first commit
author | Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 08 Nov 2010 01:23:25 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/kernel/memory/MemList.cc Mon Nov 08 01:23:25 2010 +0900 @@ -0,0 +1,96 @@ +/*! + MemList は空にならない。最低1個は要素が入っていて + 1個目は特別扱いする。getFirst すると first->next を返す + */ +#include <stdio.h> +#include "MemList.h" + +/*! + 最初の1個は特別扱いなので、それの後に追加していく + */ +void +MemList::addFirst(MemorySegment* e) +{ + e->prev = first; + e->next = first->next; + first->next->prev = e; + first->next = e; +} + +void +MemList::addLast(MemorySegment* e) +{ + e->next = first; + e->prev = last; + last->next = e; + last = e; +} + +MemorySegment* +MemList::getFirst() +{ + return first->next; +} + +MemorySegment* +MemList::getLast() +{ + return last; +} + +int +MemList::remove(MemorySegment* e) +{ + e->prev->next = e->next; + 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; +}