From d358c1d67255c4d2df74523972c282afc8322b4d Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Tue, 6 Jun 2023 19:12:46 -0700 Subject: [PATCH] Move process be to RefCounted --- zion/loader/init_loader.cpp | 3 ++- zion/scheduler/process.cpp | 5 +++-- zion/scheduler/process.h | 9 ++++++--- zion/scheduler/process_manager.cpp | 2 +- zion/scheduler/process_manager.h | 6 +++--- zion/syscall/syscall.cpp | 2 +- 6 files changed, 16 insertions(+), 11 deletions(-) diff --git a/zion/loader/init_loader.cpp b/zion/loader/init_loader.cpp index 86a5fbf..149b6f7 100644 --- a/zion/loader/init_loader.cpp +++ b/zion/loader/init_loader.cpp @@ -2,6 +2,7 @@ #include "boot/boot_info.h" #include "debug/debug.h" +#include "lib/ref_ptr.h" #include "loader/elf_loader.h" #include "memory/paging_util.h" #include "scheduler/process.h" @@ -49,7 +50,7 @@ void LoadInitProgram() { const limine_file& init_prog = GetInitProgram("/sys/test"); const limine_file& prog2 = GetInitProgram("/sys/test2"); - SharedPtr proc = MakeShared(); + RefPtr proc = MakeRefCounted(); gProcMan->InsertProcess(proc); uint64_t entry = LoadElfProgram( diff --git a/zion/scheduler/process.cpp b/zion/scheduler/process.cpp index 7db76b2..a612e3b 100644 --- a/zion/scheduler/process.cpp +++ b/zion/scheduler/process.cpp @@ -13,13 +13,14 @@ static uint64_t gNextId = 1; } -SharedPtr Process::RootProcess() { - SharedPtr proc(new Process(0)); +RefPtr Process::RootProcess() { + RefPtr proc = MakeRefCounted(0); proc->threads_.PushBack(Thread::RootThread(*proc)); proc->next_thread_id_ = 1; return proc; } +RefPtr Process::Create() { return MakeRefCounted(); } Process::Process() : id_(gNextId++), state_(RUNNING) { caps_.PushBack(new Capability(this, Capability::PROCESS, Z_INIT_PROC_SELF, diff --git a/zion/scheduler/process.h b/zion/scheduler/process.h index 32d728c..051a460 100644 --- a/zion/scheduler/process.h +++ b/zion/scheduler/process.h @@ -4,6 +4,7 @@ #include "capability/capability.h" #include "lib/linked_list.h" +#include "lib/ref_counted.h" #include "lib/ref_ptr.h" #include "lib/shared_ptr.h" #include "memory/virtual_memory.h" @@ -11,7 +12,7 @@ // Forward decl due to cyclic dependency. class Thread; -class Process { +class Process : public RefCounted { public: enum State { UNSPECIFIED, @@ -19,8 +20,8 @@ class Process { RUNNING, FINISHED, }; - static SharedPtr RootProcess(); - Process(); + static RefPtr RootProcess(); + static RefPtr Create(); uint64_t id() const { return id_; } VirtualMemory& vmm() { return vmm_; } @@ -37,6 +38,8 @@ class Process { State GetState() { return state_; } private: + friend class MakeRefCountedFriend; + Process(); Process(uint64_t id) : id_(id), vmm_(VirtualMemory::ForRoot()) {} uint64_t id_; VirtualMemory vmm_; diff --git a/zion/scheduler/process_manager.cpp b/zion/scheduler/process_manager.cpp index bb00763..70148a3 100644 --- a/zion/scheduler/process_manager.cpp +++ b/zion/scheduler/process_manager.cpp @@ -7,7 +7,7 @@ void ProcessManager::Init() { gProcMan->InsertProcess(Process::RootProcess()); } -void ProcessManager::InsertProcess(const SharedPtr& proc) { +void ProcessManager::InsertProcess(const RefPtr& proc) { proc_list_.PushBack(proc); } diff --git a/zion/scheduler/process_manager.h b/zion/scheduler/process_manager.h index ea92436..60c1dac 100644 --- a/zion/scheduler/process_manager.h +++ b/zion/scheduler/process_manager.h @@ -1,7 +1,7 @@ #pragma once #include "lib/linked_list.h" -#include "lib/shared_ptr.h" +#include "lib/ref_ptr.h" #include "scheduler/process.h" class ProcessManager { @@ -10,14 +10,14 @@ class ProcessManager { // and stores it in the global variable. static void Init(); - void InsertProcess(const SharedPtr& proc); + void InsertProcess(const RefPtr& proc); Process& FromId(uint64_t id); void DumpProcessStates(); private: // TODO: This should be a hashmap. - LinkedList> proc_list_; + LinkedList> proc_list_; }; extern ProcessManager* gProcMan; diff --git a/zion/syscall/syscall.cpp b/zion/syscall/syscall.cpp index 66161e1..084d9e2 100644 --- a/zion/syscall/syscall.cpp +++ b/zion/syscall/syscall.cpp @@ -71,7 +71,7 @@ uint64_t ProcessSpawnElf(ZProcessSpawnElfReq* req) { return ZE_DENIED; } dbgln("Proc spawn: %u:%u", req->elf_base, req->elf_size); - SharedPtr proc = MakeShared(); + RefPtr proc = MakeRefCounted(); gProcMan->InsertProcess(proc); uint64_t entry = LoadElfProgram(*proc, req->elf_base, req->elf_size); proc->CreateThread()->Start(entry, 0, 0);