summaryrefslogtreecommitdiff
path: root/Source/Kernel/TaskManager/Thread.class.cpp
diff options
context:
space:
mode:
authorAlexis211 <alexis211@gmail.com>2009-10-17 16:40:56 +0200
committerAlexis211 <alexis211@gmail.com>2009-10-17 16:40:56 +0200
commit9520a1a101b264abe700c3f7753f5f55bba4c681 (patch)
tree2d73552c689c4de39b28c0e9930bc135b199a273 /Source/Kernel/TaskManager/Thread.class.cpp
parent45fcf4cc7ddacd93df2dd4d88ad31f6061e8d4a8 (diff)
downloadMelon-9520a1a101b264abe700c3f7753f5f55bba4c681.tar.gz
Melon-9520a1a101b264abe700c3f7753f5f55bba4c681.zip
Each thread now has a kernel stack and an user stack
Diffstat (limited to 'Source/Kernel/TaskManager/Thread.class.cpp')
-rw-r--r--Source/Kernel/TaskManager/Thread.class.cpp37
1 files changed, 21 insertions, 16 deletions
diff --git a/Source/Kernel/TaskManager/Thread.class.cpp b/Source/Kernel/TaskManager/Thread.class.cpp
index 20d6cd4..6d62474 100644
--- a/Source/Kernel/TaskManager/Thread.class.cpp
+++ b/Source/Kernel/TaskManager/Thread.class.cpp
@@ -14,35 +14,40 @@ Thread::Thread() { //Private constructor, does nothing
Thread::Thread(thread_entry_t entry_point, void* data, bool iskernel) {
if (iskernel) {
- m_isKernel = true;
- u32int tmp;
- m_kernelStackFrame = (u32int)PageAlloc::alloc(&tmp);
- m_process = Task::getKernelProcess();
- setup(entry_point, data, m_kernelStackFrame + 0x1000); //A kernel stack always is 1 frame, meaning 0x1000 bytes
+ setup(Task::getKernelProcess(), entry_point, data, true);
} else {
- m_isKernel = false;
- m_process = Task::currProcess();
- setup(entry_point, data, (u32int)(m_process->heap().alloc(STACKSIZE)) + STACKSIZE);
+ setup(Task::currProcess(), entry_point, data, false);
}
}
Thread::Thread(Process* process, thread_entry_t entry_point, void* data) {
- m_isKernel = false;
- m_process = process;
- setup(entry_point, data, (u32int)(m_process->heap().alloc(STACKSIZE)) + STACKSIZE);
+ setup(process, entry_point, data, false);
}
Thread::~Thread() {
Task::unregisterThread(this);
- if (m_isKernel) {
- PageAlloc::free((void*)m_kernelStackFrame);
- }
+ Mem::kfree(m_kernelStack.addr);
+ if (!m_isKernel) m_process->heap().free(m_userStack.addr);
//Don't unregister thread in process, it has probably already been done
}
-void Thread::setup(thread_entry_t entry_point, void* data, u32int esp) {
+void Thread::setup(Process* process, thread_entry_t entry_point, void* data, bool isKernel) {
+ DEBUG("new Thread :: setup");
+ m_isKernel = isKernel;
+ m_process = process;
+ m_kernelStack.addr = Mem::kalloc(STACKSIZE);
+ m_kernelStack.size = STACKSIZE;
+
+ if (m_isKernel) {
+ m_userStack.size = 0;
+ m_userStack.addr = 0;
+ } else {
+ m_userStack.addr = m_process->heap().alloc(STACKSIZE);
+ m_userStack.size = STACKSIZE;
+ }
+ u32int* stack = (u32int*)((u32int)(m_kernelStack.addr) + m_kernelStack.size);
+
//Pass function parameters for runThread()
- u32int *stack = (u32int*)esp;
stack--;
*stack = (u32int)entry_point; //Push entry point (function parameter)
stack--;