diff --git a/zion/loader/init_loader.cpp b/zion/loader/init_loader.cpp index 8f4bd8f..86a5fbf 100644 --- a/zion/loader/init_loader.cpp +++ b/zion/loader/init_loader.cpp @@ -6,6 +6,7 @@ #include "memory/paging_util.h" #include "scheduler/process.h" #include "scheduler/process_manager.h" +#include "scheduler/thread.h" namespace { @@ -58,5 +59,5 @@ void LoadInitProgram() { prog2.size, *proc, proc->vmm().GetNextMemMapAddr(prog2.size)); - proc->CreateThread(entry); + proc->CreateThread()->Start(entry, 0, 0); } diff --git a/zion/scheduler/process.cpp b/zion/scheduler/process.cpp index da90be3..f0131de 100644 --- a/zion/scheduler/process.cpp +++ b/zion/scheduler/process.cpp @@ -21,7 +21,10 @@ SharedPtr Process::RootProcess() { return proc; } -Process::Process() : id_(gNextId++), state_(RUNNING) {} +Process::Process() : id_(gNextId++), state_(RUNNING) { + caps_.PushBack(new Capability(this, Capability::PROCESS, Z_INIT_PROC_SELF, + ZC_PROC_SPAWN_PROC | ZC_PROC_SPAWN_THREAD)); +} SharedPtr Process::CreateThread() { SharedPtr thread{new Thread(*this, next_thread_id_++, 0)}; @@ -29,15 +32,6 @@ SharedPtr Process::CreateThread() { return thread; } -void Process::CreateThread(uint64_t entry) { - Thread* thread = new Thread(*this, next_thread_id_++, entry); - threads_.PushBack(thread); - caps_.PushBack(new Capability(this, Capability::PROCESS, Z_INIT_PROC_SELF, - ZC_PROC_SPAWN_PROC | ZC_PROC_SPAWN_THREAD)); - thread->SetState(Thread::RUNNABLE); - gScheduler->Enqueue(thread); -} - SharedPtr Process::GetThread(uint64_t tid) { auto iter = threads_.begin(); while (iter != threads_.end()) { diff --git a/zion/scheduler/process.h b/zion/scheduler/process.h index f9ab96e..fa9b7d4 100644 --- a/zion/scheduler/process.h +++ b/zion/scheduler/process.h @@ -25,7 +25,6 @@ class Process { VirtualMemory& vmm() { return vmm_; } SharedPtr CreateThread(); - void CreateThread(uint64_t entry); SharedPtr GetThread(uint64_t tid); SharedPtr GetCapability(uint64_t cid); diff --git a/zion/syscall/syscall.cpp b/zion/syscall/syscall.cpp index 40f58a7..66161e1 100644 --- a/zion/syscall/syscall.cpp +++ b/zion/syscall/syscall.cpp @@ -74,7 +74,7 @@ uint64_t ProcessSpawnElf(ZProcessSpawnElfReq* req) { SharedPtr proc = MakeShared(); gProcMan->InsertProcess(proc); uint64_t entry = LoadElfProgram(*proc, req->elf_base, req->elf_size); - proc->CreateThread(entry); + proc->CreateThread()->Start(entry, 0, 0); return 0; }