summaryrefslogtreecommitdiff
path: root/Source/Kernel/TaskManager
diff options
context:
space:
mode:
authorAlexis211 <alexis211@gmail.com>2009-10-18 21:56:26 +0200
committerAlexis211 <alexis211@gmail.com>2009-10-18 21:56:26 +0200
commit0cca2d68451849b5ea96a3620566fd0b42dde3c0 (patch)
treefcdcaace870a59d0b8f2ccc6abb8418763960dbe /Source/Kernel/TaskManager
parent776753bfa0c411f4b1a5680409104904961fcbeb (diff)
downloadMelon-0cca2d68451849b5ea96a3620566fd0b42dde3c0.tar.gz
Melon-0cca2d68451849b5ea96a3620566fd0b42dde3c0.zip
More work on syscalls
Diffstat (limited to 'Source/Kernel/TaskManager')
-rw-r--r--Source/Kernel/TaskManager/Thread.class.cpp13
-rw-r--r--Source/Kernel/TaskManager/Thread.class.h4
2 files changed, 16 insertions, 1 deletions
diff --git a/Source/Kernel/TaskManager/Thread.class.cpp b/Source/Kernel/TaskManager/Thread.class.cpp
index 315eae2..98fa32d 100644
--- a/Source/Kernel/TaskManager/Thread.class.cpp
+++ b/Source/Kernel/TaskManager/Thread.class.cpp
@@ -52,6 +52,7 @@ void runThread(Thread* thread, void* data, thread_entry_t entry_point) {
}
Thread::Thread() : Ressource(TH_IFACE_OBJTYPE) { //Private constructor, does nothing
+ m_xchgspace = 0;
}
Thread::Thread(thread_entry_t entry_point, void* data, bool iskernel) : Ressource(TH_IFACE_OBJTYPE) {
@@ -69,10 +70,13 @@ Thread::Thread(Process* process, thread_entry_t entry_point, void* data) : Resso
Thread::~Thread() {
Task::unregisterThread(this);
Mem::free(m_kernelStack.addr);
+ m_process->getPagedir()->switchTo();
if (m_userStack.addr != 0) {
- m_process->getPagedir()->switchTo();
m_process->heap().free(m_userStack.addr);
}
+ if (m_xchgspace != 0) {
+ m_process->heap().free(m_xchgspace);
+ }
//Don't unregister thread in process, it has probably already been done
}
@@ -80,6 +84,7 @@ void Thread::setup(Process* process, thread_entry_t entry_point, void* data, boo
addCall1(TH_IFACE_SLEEP, (call1)&Thread::sleepSC);
addCall1(TH_IFACE_FINISH, (call1)&Thread::finishSC);
+ m_xchgspace = 0;
m_isKernel = isKernel;
m_process = process;
m_kernelStack.addr = Mem::alloc(STACKSIZE);
@@ -181,6 +186,12 @@ u32int Thread::getEip() { return m_eip; }
Process* Thread::getProcess() { return m_process; }
+void* Thread::mkXchgSpace(u32int sz) {
+ if (m_xchgspace != 0) m_process->heap().free(m_xchgspace);
+ m_xchgspace = m_process->heap().alloc(sz);
+ return m_xchgspace;
+}
+
void Thread::sleep(u32int msecs) {
m_state = T_SLEEPING;
waitfor.m_time = Time::time() + msecs;
diff --git a/Source/Kernel/TaskManager/Thread.class.h b/Source/Kernel/TaskManager/Thread.class.h
index 8a7d45e..42baa86 100644
--- a/Source/Kernel/TaskManager/Thread.class.h
+++ b/Source/Kernel/TaskManager/Thread.class.h
@@ -22,6 +22,8 @@ class Thread : public Ressource {
u32int m_esp, m_ebp, m_eip;
u8int m_state; //Is one of T_* defined above
+ void* m_xchgspace;
+
union { //What the thread might be waiting for
u32int m_time;
u8int m_irq; //An IRQ number
@@ -49,6 +51,8 @@ class Thread : public Ressource {
u32int getEip();
Process* getProcess();
+ void* mkXchgSpace(u32int sz);
+
void sleep(u32int msecs);
void waitIRQ(u8int irq);
bool runnable(); //Called by scheduler