From 751ebe55e9e48ea6f69af323aaa2f1af291ad575 Mon Sep 17 00:00:00 2001 From: Weiyi Wang Date: Sat, 13 Oct 2018 17:24:51 -0400 Subject: [PATCH] Kernel: pass ref down to Object and wrap ID counter into kernel state --- src/core/hle/kernel/address_arbiter.cpp | 2 +- src/core/hle/kernel/client_port.cpp | 2 +- src/core/hle/kernel/client_session.cpp | 2 +- src/core/hle/kernel/event.cpp | 2 +- src/core/hle/kernel/kernel.cpp | 8 ++++---- src/core/hle/kernel/kernel.h | 4 ++++ src/core/hle/kernel/mutex.cpp | 2 +- src/core/hle/kernel/object.cpp | 3 +++ src/core/hle/kernel/object.h | 8 ++++---- src/core/hle/kernel/process.cpp | 4 ++-- src/core/hle/kernel/resource_limit.cpp | 2 +- src/core/hle/kernel/semaphore.cpp | 2 +- src/core/hle/kernel/server_port.cpp | 2 +- src/core/hle/kernel/server_session.cpp | 2 +- src/core/hle/kernel/shared_memory.cpp | 2 +- src/core/hle/kernel/thread.cpp | 2 +- src/core/hle/kernel/timer.cpp | 2 +- src/core/hle/kernel/wait_object.h | 2 ++ 18 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/core/hle/kernel/address_arbiter.cpp b/src/core/hle/kernel/address_arbiter.cpp index ad2805cbf..d391da208 100644 --- a/src/core/hle/kernel/address_arbiter.cpp +++ b/src/core/hle/kernel/address_arbiter.cpp @@ -65,7 +65,7 @@ SharedPtr AddressArbiter::ResumeHighestPriorityThread(VAddr address) { return thread; } -AddressArbiter::AddressArbiter(KernelSystem& kernel) {} +AddressArbiter::AddressArbiter(KernelSystem& kernel) : Object(kernel) {} AddressArbiter::~AddressArbiter() {} SharedPtr KernelSystem::CreateAddressArbiter(std::string name) { diff --git a/src/core/hle/kernel/client_port.cpp b/src/core/hle/kernel/client_port.cpp index bfbfc3720..02c5d08fd 100644 --- a/src/core/hle/kernel/client_port.cpp +++ b/src/core/hle/kernel/client_port.cpp @@ -13,7 +13,7 @@ namespace Kernel { -ClientPort::ClientPort(KernelSystem& kernel) : kernel(kernel) {} +ClientPort::ClientPort(KernelSystem& kernel) : kernel(kernel), Object(kernel) {} ClientPort::~ClientPort() = default; ResultVal> ClientPort::Connect() { diff --git a/src/core/hle/kernel/client_session.cpp b/src/core/hle/kernel/client_session.cpp index c2c3634ba..ef1b90195 100644 --- a/src/core/hle/kernel/client_session.cpp +++ b/src/core/hle/kernel/client_session.cpp @@ -13,7 +13,7 @@ namespace Kernel { -ClientSession::ClientSession(KernelSystem& kernel) {} +ClientSession::ClientSession(KernelSystem& kernel) : Object(kernel) {} ClientSession::~ClientSession() { // This destructor will be called automatically when the last ClientSession handle is closed by // the emulated application. diff --git a/src/core/hle/kernel/event.cpp b/src/core/hle/kernel/event.cpp index d2acee21b..ce5f3d6ec 100644 --- a/src/core/hle/kernel/event.cpp +++ b/src/core/hle/kernel/event.cpp @@ -12,7 +12,7 @@ namespace Kernel { -Event::Event(KernelSystem& kernel) {} +Event::Event(KernelSystem& kernel) : WaitObject(kernel) {} Event::~Event() {} SharedPtr KernelSystem::CreateEvent(ResetType reset_type, std::string name) { diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 8a8fa6709..ba7223db4 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -14,8 +14,6 @@ namespace Kernel { -std::atomic Object::next_object_id{0}; - /// Initialize the kernel KernelSystem::KernelSystem(u32 system_mode) { ConfigMem::Init(); @@ -25,8 +23,6 @@ KernelSystem::KernelSystem(u32 system_mode) { resource_limits = std::make_unique(*this); Kernel::ThreadingInit(); Kernel::TimersInit(); - - Object::next_object_id = 0; // TODO(Subv): Start the process ids from 10 for now, as lower PIDs are // reserved for low-level services Process::next_process_id = 10; @@ -51,4 +47,8 @@ const ResourceLimitList& KernelSystem::ResourceLimit() const { return *resource_limits; } +u32 KernelSystem::GenerateObjectID() { + return next_object_id++; +} + } // namespace Kernel diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index 4d0390408..98a5d14a2 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h @@ -4,6 +4,7 @@ #pragma once +#include #include #include #include @@ -177,8 +178,11 @@ public: MemoryPermission other_permissions, std::string name = "Unknown Applet"); + u32 GenerateObjectID(); + private: std::unique_ptr resource_limits; + std::atomic next_object_id{0}; }; } // namespace Kernel diff --git a/src/core/hle/kernel/mutex.cpp b/src/core/hle/kernel/mutex.cpp index dc4a55d35..f31a2a5d7 100644 --- a/src/core/hle/kernel/mutex.cpp +++ b/src/core/hle/kernel/mutex.cpp @@ -24,7 +24,7 @@ void ReleaseThreadMutexes(Thread* thread) { thread->held_mutexes.clear(); } -Mutex::Mutex(KernelSystem& kernel) {} +Mutex::Mutex(KernelSystem& kernel) : WaitObject(kernel) {} Mutex::~Mutex() {} SharedPtr KernelSystem::CreateMutex(bool initial_locked, std::string name) { diff --git a/src/core/hle/kernel/object.cpp b/src/core/hle/kernel/object.cpp index 48bc80fb2..f9ca68218 100644 --- a/src/core/hle/kernel/object.cpp +++ b/src/core/hle/kernel/object.cpp @@ -3,10 +3,13 @@ // Refer to the license.txt file included. #include "common/assert.h" +#include "core/hle/kernel/kernel.h" #include "core/hle/kernel/object.h" namespace Kernel { +Object::Object(KernelSystem& kernel) : object_id{kernel.GenerateObjectID()} {} + Object::~Object() = default; bool Object::IsWaitable() const { diff --git a/src/core/hle/kernel/object.h b/src/core/hle/kernel/object.h index 6d05a30ea..f1fd03295 100644 --- a/src/core/hle/kernel/object.h +++ b/src/core/hle/kernel/object.h @@ -11,6 +11,8 @@ namespace Kernel { +class KernelSystem; + using Handle = u32; enum class HandleType : u32 { @@ -37,6 +39,7 @@ enum { class Object : NonCopyable { public: + explicit Object(KernelSystem& kernel); virtual ~Object(); /// Returns a unique identifier for the object. For debugging purposes only. @@ -58,15 +61,12 @@ public: */ bool IsWaitable() const; -public: - static std::atomic next_object_id; - private: friend void intrusive_ptr_add_ref(Object*); friend void intrusive_ptr_release(Object*); std::atomic ref_count{0}; - std::atomic object_id{next_object_id++}; + std::atomic object_id; }; // Special functions used by boost::instrusive_ptr to do automatic ref-counting diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index 5d1b9389a..ae799d15f 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp @@ -29,7 +29,7 @@ SharedPtr KernelSystem::CreateCodeSet(std::string name, u64 program_id) return codeset; } -CodeSet::CodeSet(KernelSystem& system) {} +CodeSet::CodeSet(KernelSystem& kernel) : Object(kernel) {} CodeSet::~CodeSet() {} u32 Process::next_process_id; @@ -304,7 +304,7 @@ ResultCode Process::LinearFree(VAddr target, u32 size) { return RESULT_SUCCESS; } -Kernel::Process::Process(KernelSystem& kernel) : kernel(kernel) {} +Kernel::Process::Process(KernelSystem& kernel) : Object(kernel), kernel(kernel) {} Kernel::Process::~Process() {} void ClearProcessList() { diff --git a/src/core/hle/kernel/resource_limit.cpp b/src/core/hle/kernel/resource_limit.cpp index 4aaf6be6b..3498acb23 100644 --- a/src/core/hle/kernel/resource_limit.cpp +++ b/src/core/hle/kernel/resource_limit.cpp @@ -9,7 +9,7 @@ namespace Kernel { -ResourceLimit::ResourceLimit(KernelSystem& kernel) {} +ResourceLimit::ResourceLimit(KernelSystem& kernel) : Object(kernel) {} ResourceLimit::~ResourceLimit() {} SharedPtr ResourceLimit::Create(KernelSystem& kernel, std::string name) { diff --git a/src/core/hle/kernel/semaphore.cpp b/src/core/hle/kernel/semaphore.cpp index afe770a64..8193f848d 100644 --- a/src/core/hle/kernel/semaphore.cpp +++ b/src/core/hle/kernel/semaphore.cpp @@ -10,7 +10,7 @@ namespace Kernel { -Semaphore::Semaphore(KernelSystem& kernel) {} +Semaphore::Semaphore(KernelSystem& kernel) : WaitObject(kernel) {} Semaphore::~Semaphore() {} ResultVal> KernelSystem::CreateSemaphore(s32 initial_count, s32 max_count, diff --git a/src/core/hle/kernel/server_port.cpp b/src/core/hle/kernel/server_port.cpp index 44a5ca841..e17e699a4 100644 --- a/src/core/hle/kernel/server_port.cpp +++ b/src/core/hle/kernel/server_port.cpp @@ -13,7 +13,7 @@ namespace Kernel { -ServerPort::ServerPort(KernelSystem& kernel) {} +ServerPort::ServerPort(KernelSystem& kernel) : WaitObject(kernel) {} ServerPort::~ServerPort() {} ResultVal> ServerPort::Accept() { diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp index 3382abae3..83e2ec4fa 100644 --- a/src/core/hle/kernel/server_session.cpp +++ b/src/core/hle/kernel/server_session.cpp @@ -13,7 +13,7 @@ namespace Kernel { -ServerSession::ServerSession(KernelSystem& kernel) {} +ServerSession::ServerSession(KernelSystem& kernel) : WaitObject(kernel) {} ServerSession::~ServerSession() { // This destructor will be called automatically when the last ServerSession handle is closed by // the emulated application. diff --git a/src/core/hle/kernel/shared_memory.cpp b/src/core/hle/kernel/shared_memory.cpp index 14a206c59..35bd53003 100644 --- a/src/core/hle/kernel/shared_memory.cpp +++ b/src/core/hle/kernel/shared_memory.cpp @@ -11,7 +11,7 @@ namespace Kernel { -SharedMemory::SharedMemory(KernelSystem& system) {} +SharedMemory::SharedMemory(KernelSystem& kernel) : Object(kernel) {} SharedMemory::~SharedMemory() {} SharedPtr KernelSystem::CreateSharedMemory(SharedPtr owner_process, u32 size, diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index bf7a18685..6844e76d5 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp @@ -60,7 +60,7 @@ inline static u32 const NewThreadId() { return next_thread_id++; } -Thread::Thread(KernelSystem&) : context(Core::CPU().NewContext()) {} +Thread::Thread(KernelSystem& kernel) : WaitObject(kernel), context(Core::CPU().NewContext()) {} Thread::~Thread() {} Thread* GetCurrentThread() { diff --git a/src/core/hle/kernel/timer.cpp b/src/core/hle/kernel/timer.cpp index b229a94af..8ef96e058 100644 --- a/src/core/hle/kernel/timer.cpp +++ b/src/core/hle/kernel/timer.cpp @@ -19,7 +19,7 @@ static CoreTiming::EventType* timer_callback_event_type = nullptr; // us to simply use a pool index or similar. static Kernel::HandleTable timer_callback_handle_table; -Timer::Timer(KernelSystem& kernel) {} +Timer::Timer(KernelSystem& kernel) : WaitObject(kernel) {} Timer::~Timer() {} SharedPtr KernelSystem::CreateTimer(ResetType reset_type, std::string name) { diff --git a/src/core/hle/kernel/wait_object.h b/src/core/hle/kernel/wait_object.h index 2b9a9393b..01fc40a0d 100644 --- a/src/core/hle/kernel/wait_object.h +++ b/src/core/hle/kernel/wait_object.h @@ -16,6 +16,8 @@ class Thread; /// Class that represents a Kernel object that a thread can be waiting on class WaitObject : public Object { public: + using Object::Object; + /** * Check if the specified thread should wait until the object is available * @param thread The thread about which we're deciding.