summaryrefslogtreecommitdiff
path: root/Source/Kernel/TaskManager
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Kernel/TaskManager')
-rw-r--r--Source/Kernel/TaskManager/Task.ns.cpp23
1 files changed, 10 insertions, 13 deletions
diff --git a/Source/Kernel/TaskManager/Task.ns.cpp b/Source/Kernel/TaskManager/Task.ns.cpp
index a32c8c0..30610d1 100644
--- a/Source/Kernel/TaskManager/Task.ns.cpp
+++ b/Source/Kernel/TaskManager/Task.ns.cpp
@@ -1,5 +1,6 @@
#include "Task.ns.h"
#include <Library/Vector.class.h>
+#include <Library/SimpleList.class.h>
//From Task.wtf.asm
extern "C" u32int read_eip();
@@ -13,8 +14,9 @@ Vector <Thread*> threads;
struct finished_thread_t { //Forms a linked list
Thread* thread;
u32int errcode;
- finished_thread_t *next;
-} *firstFinishedThread = 0;
+};
+
+SimpleList<finished_thread_t> *firstFinishedThread = 0;
Thread* currentThread = NULL;
Process* currentProcess = NULL;
@@ -38,11 +40,9 @@ Thread* nextThread() {
//Clean up finished threads
while (firstFinishedThread != 0) {
DEBUG_HEX((u32int)firstFinishedThread);
- if (firstFinishedThread->thread == currentThread) break;
- firstFinishedThread->thread->finish(firstFinishedThread->errcode);
- finished_thread_t* t = firstFinishedThread;
- firstFinishedThread = t->next;
- delete t;
+ if (firstFinishedThread->v().thread == currentThread) break;
+ firstFinishedThread->v().thread->finish(firstFinishedThread->v().errcode);
+ firstFinishedThread = firstFinishedThread->delThis();
}
for (u32int i = 0; i < threads.size(); i++) {
if (threads[i] == currentThread) {
@@ -56,7 +56,7 @@ Thread* nextThread() {
nid++;
if (nid >= threads.size()) nid = 0;
if (threads[nid]->runnable() and threads[nid] != idleThread) {
- if (firstFinishedThread != 0 and firstFinishedThread->thread == threads[nid]) return idleThread;
+ if (firstFinishedThread != 0 and firstFinishedThread->v().thread == threads[nid]) return idleThread;
currentThreadId = nid;
return threads[nid];
}
@@ -128,11 +128,8 @@ Process* getKernelProcess() {
}
void currentThreadExits(u32int errcode) {
- finished_thread_t *t = new finished_thread_t;
- t->thread = currentThread;
- t->errcode = errcode;
- t->next = firstFinishedThread;
- firstFinishedThread = t;
+ finished_thread_t tmp = {currentThread, errcode};
+ firstFinishedThread = firstFinishedThread->cons(tmp);
}
void registerThread(Thread* t) {