Mercurial > hg > Members > kono > Cerium
diff TaskManager/kernel/ppe/TaskQueueInfo.cc @ 479:5bda98b0b56d
Double Linked List base TaskQueue
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 05 Oct 2009 10:36:37 +0900 (2009-10-05) |
parents | 5c194c71eca8 |
children | 46464727d825 |
line wrap: on
line diff
--- a/TaskManager/kernel/ppe/TaskQueueInfo.cc Mon Oct 05 08:56:56 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskQueueInfo.cc Mon Oct 05 10:36:37 2009 +0900 @@ -13,6 +13,8 @@ if (taskQueuePool == NULL) { return extend_pool(num); } + // 最初の一つは自分 + next = prev = this; return 0; } @@ -51,7 +53,7 @@ freeTaskQueue = freeTaskQueue->next; q->task = task; - q->next = NULL; + q->next = q->prev = NULL; return q; } @@ -61,6 +63,7 @@ TaskQueueInfo::free(TaskQueuePtr q) { q->next = freeTaskQueue; + q->prev = NULL; freeTaskQueue = q; } @@ -86,3 +89,120 @@ } + + +/*! + TaskQueueInfo は空にならない。最低1個は要素が入っていて + 1個目は特別扱いする。getFirst すると first->next を返す + */ + +/*! + 最初の1個は特別扱いなので、それの後に追加していく + */ +void +TaskQueueInfo::addFirst(TaskQueue* e) +{ + e->prev = first; + e->next = first->next; + first->next->prev = e; + first->next = e; +} + +void +TaskQueueInfo::addLast(TaskQueue* e) +{ + e->next = first; + e->prev = last; + last->next = e; + last = e; +} + +TaskQueue* +TaskQueueInfo::getFirst() +{ + return first->next; +} + +TaskQueue* +TaskQueueInfo::getLast() +{ + return last; +} + +int +TaskQueueInfo::remove(TaskQueue* 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 を返す。 + */ + +TaskQueue* +TaskQueueInfo::poll() +{ + TaskQueue* e = first->next; + if (e == this) { + return NULL; + } + remove(e); + return e; +} + +void +TaskQueueInfo::moveToFirst(TaskQueue* e) +{ + remove(e); + addFirst(e); +} + +/*! + リスト内の指定された位置にある要素を返す。 + 要素数を超えた位置を指定した場合 NULL を返す。 + */ + +TaskQueue* +TaskQueueInfo::get(int index) +{ + TaskQueue* e = first->next; + for (int i = 0; i < index; i++) { + if (e == this) return NULL; + e = e->next; + } + return e; +} + +TaskQueue* +TaskQueueInfo::find(Task* task) +{ + TaskQueue* e = first->next; + for(;;) { + if (e == this) return NULL; + if (e->task == task) return e; + e = e->next; + } + return e; +} + +int +TaskQueueInfo::empty() +{ + return next == this; +} + + +/* end */