diff options
author | Alexis211 <alexis211@gmail.com> | 2009-10-18 21:56:26 +0200 |
---|---|---|
committer | Alexis211 <alexis211@gmail.com> | 2009-10-18 21:56:26 +0200 |
commit | 0cca2d68451849b5ea96a3620566fd0b42dde3c0 (patch) | |
tree | fcdcaace870a59d0b8f2ccc6abb8418763960dbe /Source/Kernel/TaskManager | |
parent | 776753bfa0c411f4b1a5680409104904961fcbeb (diff) | |
download | Melon-0cca2d68451849b5ea96a3620566fd0b42dde3c0.tar.gz Melon-0cca2d68451849b5ea96a3620566fd0b42dde3c0.zip |
More work on syscalls
Diffstat (limited to 'Source/Kernel/TaskManager')
-rw-r--r-- | Source/Kernel/TaskManager/Thread.class.cpp | 13 | ||||
-rw-r--r-- | Source/Kernel/TaskManager/Thread.class.h | 4 |
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 |