From 55340e2917231064c5b7b9d13fbea59f3be7ed99 Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Wed, 7 Jun 2023 06:21:36 -0700 Subject: [PATCH] Make Capability RefCounted --- zion/capability/capability.h | 2 +- zion/lib/shared_ptr.h | 89 ------------------------------------ zion/object/process.cpp | 29 ++++++------ zion/object/process.h | 5 +- zion/syscall/syscall.cpp | 8 ++-- 5 files changed, 22 insertions(+), 111 deletions(-) delete mode 100644 zion/lib/shared_ptr.h diff --git a/zion/capability/capability.h b/zion/capability/capability.h index 14218df..3b5bf93 100644 --- a/zion/capability/capability.h +++ b/zion/capability/capability.h @@ -8,7 +8,7 @@ class Process; class Thread; -class Capability { +class Capability : public RefCounted { public: enum Type { UNDEFINED, diff --git a/zion/lib/shared_ptr.h b/zion/lib/shared_ptr.h deleted file mode 100644 index 8c26a31..0000000 --- a/zion/lib/shared_ptr.h +++ /dev/null @@ -1,89 +0,0 @@ -#pragma once - -#include - -#include "debug/debug.h" - -template -class SharedPtr { - public: - SharedPtr() : init_(false), ptr_(0), ref_cnt_(0) {} - // Takes ownership. - SharedPtr(T* ptr) { - ptr_ = ptr; - ref_cnt_ = new uint64_t(1); - } - - SharedPtr(const SharedPtr& other) - : init_(other.init_), ptr_(other.ptr_), ref_cnt_(other.ref_cnt_) { - (*ref_cnt_)++; - } - - SharedPtr& operator=(const SharedPtr& other) { - Cleanup(); - init_ = other.init_; - ptr_ = other.ptr_; - ref_cnt_ = other.ref_cnt_; - (*ref_cnt_)++; - return *this; - } - - ~SharedPtr() { Cleanup(); } - - T& operator*() { - CheckValid(); - return *ptr_; - } - const T& operator*() const { - CheckValid(); - return *ptr_; - } - T* operator->() { - CheckValid(); - return ptr_; - } - const T* operator->() const { - CheckValid(); - return ptr_; - } - - T* ptr() { - CheckValid(); - return ptr_; - } - - bool operator==(const SharedPtr& other) { - CheckValid(); - other.CheckValid(); - return ptr_ == other.ptr_; - } - - bool empty() { return !init_; } - - private: - bool init_ = true; - T* ptr_; - uint64_t* ref_cnt_; - - void Cleanup() { - if (!init_) { - return; - } - if (--(*ref_cnt_) == 0) { - dbgln("Deleting shared ptr: %m", ptr_); - delete ptr_; - delete ref_cnt_; - } - } - - void CheckValid() const { - if (!init_) { - panic("Accessing invalid shared ptr"); - } - } -}; - -template -SharedPtr MakeShared(A... args) { - return {new T(args...)}; -} diff --git a/zion/object/process.cpp b/zion/object/process.cpp index ba1807b..b55d6a4 100644 --- a/zion/object/process.cpp +++ b/zion/object/process.cpp @@ -23,10 +23,10 @@ RefPtr Process::RootProcess() { RefPtr Process::Create() { auto proc = MakeRefCounted(); proc->caps_.PushBack( - new Capability(proc, Capability::PROCESS, Z_INIT_PROC_SELF, - ZC_PROC_SPAWN_PROC | ZC_PROC_SPAWN_THREAD)); - proc->caps_.PushBack(new Capability(proc->vmas(), Capability::ADDRESS_SPACE, - Z_INIT_VMAS_SELF, ZC_WRITE)); + MakeRefCounted(proc, Capability::PROCESS, Z_INIT_PROC_SELF, + ZC_PROC_SPAWN_PROC | ZC_PROC_SPAWN_THREAD)); + proc->caps_.PushBack(MakeRefCounted( + proc->vmas(), Capability::ADDRESS_SPACE, Z_INIT_VMAS_SELF, ZC_WRITE)); return proc; } @@ -62,7 +62,7 @@ void Process::CheckState() { state_ = FINISHED; } -SharedPtr Process::GetCapability(uint64_t cid) { +RefPtr Process::GetCapability(uint64_t cid) { auto iter = caps_.begin(); while (iter != caps_.end()) { if (iter->id() == cid) { @@ -77,30 +77,31 @@ SharedPtr Process::GetCapability(uint64_t cid) { uint64_t Process::AddCapability(const RefPtr& thread) { uint64_t cap_id = next_cap_id_++; - caps_.PushBack(new Capability(thread, Capability::THREAD, cap_id, ZC_WRITE)); + caps_.PushBack( + MakeRefCounted(thread, Capability::THREAD, cap_id, ZC_WRITE)); return cap_id; } uint64_t Process::AddCapability(const RefPtr& p) { uint64_t cap_id = next_cap_id_++; - caps_.PushBack(new Capability(p, Capability::PROCESS, cap_id, - ZC_WRITE | ZC_PROC_SPAWN_THREAD)); + caps_.PushBack(MakeRefCounted(p, Capability::PROCESS, cap_id, + ZC_WRITE | ZC_PROC_SPAWN_THREAD)); return cap_id; } uint64_t Process::AddCapability(const RefPtr& vmas) { uint64_t cap_id = next_cap_id_++; - caps_.PushBack( - new Capability(vmas, Capability::ADDRESS_SPACE, cap_id, ZC_WRITE)); + caps_.PushBack(MakeRefCounted(vmas, Capability::ADDRESS_SPACE, + cap_id, ZC_WRITE)); return cap_id; } uint64_t Process::AddCapability(const RefPtr& vmmo) { uint64_t cap_id = next_cap_id_++; - caps_.PushBack( - new Capability(vmmo, Capability::MEMORY_OBJECT, cap_id, ZC_WRITE)); + caps_.PushBack(MakeRefCounted(vmmo, Capability::MEMORY_OBJECT, + cap_id, ZC_WRITE)); return cap_id; } void Process::AddCapability(uint64_t cap_id, const RefPtr& vmmo) { - caps_.PushBack( - new Capability(vmmo, Capability::MEMORY_OBJECT, cap_id, ZC_WRITE)); + caps_.PushBack(MakeRefCounted(vmmo, Capability::MEMORY_OBJECT, + cap_id, ZC_WRITE)); } diff --git a/zion/object/process.h b/zion/object/process.h index 3539f90..7dd7ac6 100644 --- a/zion/object/process.h +++ b/zion/object/process.h @@ -5,7 +5,6 @@ #include "capability/capability.h" #include "lib/linked_list.h" #include "lib/ref_ptr.h" -#include "lib/shared_ptr.h" #include "object/address_space.h" // Forward decl due to cyclic dependency. @@ -28,7 +27,7 @@ class Process : public KernelObject { RefPtr CreateThread(); RefPtr GetThread(uint64_t tid); - SharedPtr GetCapability(uint64_t cid); + RefPtr GetCapability(uint64_t cid); uint64_t AddCapability(const RefPtr& t); uint64_t AddCapability(const RefPtr& p); uint64_t AddCapability(const RefPtr& vmas); @@ -53,5 +52,5 @@ class Process : public KernelObject { uint64_t next_cap_id_ = 0x100; LinkedList> threads_; - LinkedList> caps_; + LinkedList> caps_; }; diff --git a/zion/syscall/syscall.cpp b/zion/syscall/syscall.cpp index 7b4a693..298f294 100644 --- a/zion/syscall/syscall.cpp +++ b/zion/syscall/syscall.cpp @@ -59,7 +59,7 @@ void InitSyscall() { uint64_t ProcessSpawn(ZProcessSpawnReq* req, ZProcessSpawnResp* resp) { auto& curr_proc = gScheduler->CurrentProcess(); auto cap = curr_proc.GetCapability(req->proc_cap); - if (cap.empty()) { + if (!cap) { return ZE_NOT_FOUND; } if (!cap->CheckType(Capability::PROCESS)) { @@ -80,7 +80,7 @@ uint64_t ProcessSpawn(ZProcessSpawnReq* req, ZProcessSpawnResp* resp) { uint64_t ThreadCreate(ZThreadCreateReq* req, ZThreadCreateResp* resp) { auto& curr_proc = gScheduler->CurrentProcess(); auto cap = curr_proc.GetCapability(req->proc_cap); - if (cap.empty()) { + if (!cap) { return ZE_NOT_FOUND; } if (!cap->CheckType(Capability::PROCESS)) { @@ -101,7 +101,7 @@ uint64_t ThreadCreate(ZThreadCreateReq* req, ZThreadCreateResp* resp) { uint64_t ThreadStart(ZThreadStartReq* req) { auto& curr_proc = gScheduler->CurrentProcess(); auto cap = curr_proc.GetCapability(req->thread_cap); - if (cap.empty()) { + if (!cap) { return ZE_NOT_FOUND; } if (!cap->CheckType(Capability::THREAD)) { @@ -122,7 +122,7 @@ uint64_t AddressSpaceMap(ZAddressSpaceMapReq* req, ZAddressSpaceMapResp* resp) { auto& curr_proc = gScheduler->CurrentProcess(); auto vmas_cap = curr_proc.GetCapability(req->vmas_cap); auto vmmo_cap = curr_proc.GetCapability(req->vmmo_cap); - if (vmas_cap.empty() || vmmo_cap.empty()) { + if (!vmas_cap || !vmmo_cap) { return ZE_NOT_FOUND; } if (!vmas_cap->CheckType(Capability::ADDRESS_SPACE) ||