summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Source/Kernel/Library/SimpleList.class.h54
-rwxr-xr-xSource/Kernel/Melon.kebin165535 -> 166272 bytes
-rw-r--r--Source/Kernel/Shell/KernelShell.class.cpp2
-rw-r--r--Source/Kernel/TaskManager/Task.ns.cpp23
4 files changed, 65 insertions, 14 deletions
diff --git a/Source/Kernel/Library/SimpleList.class.h b/Source/Kernel/Library/SimpleList.class.h
new file mode 100644
index 0000000..c0ea111
--- /dev/null
+++ b/Source/Kernel/Library/SimpleList.class.h
@@ -0,0 +1,54 @@
+#ifndef DEF_SIMPLELIST_CLASS_H
+#define DEF_SIMPLELIST_CLASS_H
+
+/* This class implements a singly linked list. It is also used to represent one of its elements. */
+
+template <typename T>
+class SimpleList {
+ protected:
+ T m_value;
+ SimpleList<T>* m_next;
+
+ public:
+ SimpleList(const T& value, SimpleList<T>* next = 0) : m_value(value), m_next(next) {}
+ ~SimpleList() {
+ if (m_next != 0)
+ delete m_next;
+ }
+
+ T& v() { return m_value; }
+ T& operator* () { return m_value; }
+
+ SimpleList<T>* cons(const T& value) {
+ return new SimpleList<T>(value, this);
+ }
+
+ SimpleList<T>* next() {
+ return m_next;
+ }
+
+ SimpleList<T>* delThis() {
+ SimpleList<T>* ret = m_next;
+ Mem::kfree(this);
+ return ret;
+ }
+
+ void delNext() {
+ if (m_next == 0) return;
+ SimpleList<T>* temp = m_next;
+ m_next = m_next->m_next;
+ Mem::kfree(temp);
+ }
+
+ bool isEnd() {
+ return m_next == 0;
+ }
+
+ u32int size() {
+ if (m_next == 0)
+ return 0;
+ return m_next->size() + 1;
+ }
+};
+
+#endif
diff --git a/Source/Kernel/Melon.ke b/Source/Kernel/Melon.ke
index 8a8a0e8..d9ddeff 100755
--- a/Source/Kernel/Melon.ke
+++ b/Source/Kernel/Melon.ke
Binary files differ
diff --git a/Source/Kernel/Shell/KernelShell.class.cpp b/Source/Kernel/Shell/KernelShell.class.cpp
index d05487f..3d76ee0 100644
--- a/Source/Kernel/Shell/KernelShell.class.cpp
+++ b/Source/Kernel/Shell/KernelShell.class.cpp
@@ -2,6 +2,7 @@
#include <VTManager/ScrollableVT.class.h>
#include <DeviceManager/Kbd.ns.h>
#include <Library/Rand.ns.h>
+#include <Library/SimpleList.class.h>
u32int KernelShell::m_instances = 0;
@@ -30,7 +31,6 @@ KernelShell::~KernelShell() {
}
u32int KernelShell::run() {
-
struct {
const char* name;
void (KernelShell::*cmd)(Vector<String>&);
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) {