From 3e752002c4245746b4c1bf47f75af48ed866cd97 Mon Sep 17 00:00:00 2001
From: Hamish Milne <hamishmilne83@gmail.com>
Date: Wed, 25 Dec 2019 18:51:56 +0000
Subject: [PATCH] Replace g_kernel with Core::Global etc.

---
 TODO                                    | 2 +-
 src/core/core.cpp                       | 9 +++++++--
 src/core/global.h                       | 6 ++++++
 src/core/hle/kernel/address_arbiter.cpp | 3 ++-
 src/core/hle/kernel/client_port.cpp     | 3 ++-
 src/core/hle/kernel/kernel.cpp          | 2 --
 src/core/hle/kernel/kernel.h            | 2 --
 src/core/hle/kernel/mutex.cpp           | 3 ++-
 src/core/hle/kernel/process.cpp         | 7 ++++++-
 src/core/hle/kernel/process.h           | 3 ++-
 src/core/hle/kernel/server_session.cpp  | 3 ++-
 src/core/hle/kernel/thread.cpp          | 5 +++--
 src/core/hle/kernel/timer.cpp           | 3 ++-
 src/core/hle/service/am/am.h            | 3 ++-
 src/video_core/pica.cpp                 | 6 ++++++
 15 files changed, 43 insertions(+), 17 deletions(-)
 create mode 100644 src/core/global.h

diff --git a/TODO b/TODO
index 673ef0a14..7309acb1a 100644
--- a/TODO
+++ b/TODO
@@ -26,7 +26,7 @@
     ✔ Shader @done(19-08-13 16:03)
 ☐ HLE @started(19-08-13 16:43)
     ☐ Kernel @started(19-08-13 16:43)
-        Most of these require adding g_kernel
+        Most of these require adding Core::Global
         ✔ Address arbiter @done(19-08-13 16:40)
         ✔ Client port @done(19-08-13 16:40)
         ✔ Client session @done(19-08-13 16:40)
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 8ca3a2ab5..055eadae2 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -25,6 +25,7 @@
 #endif
 #include "core/custom_tex_cache.h"
 #include "core/gdbstub/gdbstub.h"
+#include "core/global.h"
 #include "core/hle/kernel/client_port.h"
 #include "core/hle/kernel/kernel.h"
 #include "core/hle/kernel/process.h"
@@ -46,6 +47,12 @@ namespace Core {
 
 /*static*/ System System::s_instance;
 
+template <>
+Core::System& Global() { return System::GetInstance(); }
+
+template <>
+Kernel::KernelSystem& Global() { return System::GetInstance().Kernel(); }
+
 System::ResultStatus System::RunLoop(bool tight_loop) {
     status = ResultStatus::Success;
     if (!cpu_core) {
@@ -204,7 +211,6 @@ System::ResultStatus System::Init(Frontend::EmuWindow& emu_window, u32 system_mo
 
     kernel = std::make_unique<Kernel::KernelSystem>(*memory, *timing,
                                                     [this] { PrepareReschedule(); }, system_mode);
-    Kernel::g_kernel = kernel.get();
 
     if (Settings::values.use_cpu_jit) {
 #ifdef ARCHITECTURE_x86_64
@@ -368,7 +374,6 @@ void System::Shutdown() {
     service_manager.reset();
     dsp_core.reset();
     cpu_core.reset();
-    Kernel::g_kernel = nullptr;
     kernel.reset();
     timing.reset();
     app_loader.reset();
diff --git a/src/core/global.h b/src/core/global.h
new file mode 100644
index 000000000..8dfd022d8
--- /dev/null
+++ b/src/core/global.h
@@ -0,0 +1,6 @@
+namespace Core {
+
+template <class T>
+T& Global();
+
+} // namespace Core
diff --git a/src/core/hle/kernel/address_arbiter.cpp b/src/core/hle/kernel/address_arbiter.cpp
index c4fb4fd99..ca120e6f9 100644
--- a/src/core/hle/kernel/address_arbiter.cpp
+++ b/src/core/hle/kernel/address_arbiter.cpp
@@ -11,6 +11,7 @@
 #include "core/hle/kernel/kernel.h"
 #include "core/hle/kernel/thread.h"
 #include "core/memory.h"
+#include "core/global.h"
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 // Kernel namespace
@@ -68,7 +69,7 @@ std::shared_ptr<Thread> AddressArbiter::ResumeHighestPriorityThread(VAddr addres
     return thread;
 }
 
-AddressArbiter::AddressArbiter() : kernel(*g_kernel) {}
+AddressArbiter::AddressArbiter() : kernel(Core::Global<KernelSystem>()) {}
 AddressArbiter::~AddressArbiter() {}
 
 std::shared_ptr<AddressArbiter> KernelSystem::CreateAddressArbiter(std::string name) {
diff --git a/src/core/hle/kernel/client_port.cpp b/src/core/hle/kernel/client_port.cpp
index 3334a278b..f9202035c 100644
--- a/src/core/hle/kernel/client_port.cpp
+++ b/src/core/hle/kernel/client_port.cpp
@@ -11,6 +11,7 @@
 #include "core/hle/kernel/object.h"
 #include "core/hle/kernel/server_port.h"
 #include "core/hle/kernel/server_session.h"
+#include "core/global.h"
 
 SERIALIZE_EXPORT_IMPL(Kernel::ClientPort)
 
@@ -26,7 +27,7 @@ ResultVal<std::shared_ptr<ClientSession>> ClientPort::Connect() {
     active_sessions++;
 
     // Create a new session pair, let the created sessions inherit the parent port's HLE handler.
-    auto [server, client] = g_kernel->CreateSessionPair(server_port->GetName(), SharedFrom(this));
+    auto [server, client] = Core::Global<KernelSystem>().CreateSessionPair(server_port->GetName(), SharedFrom(this));
 
     if (server_port->hle_handler)
         server_port->hle_handler->ClientConnected(server);
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 4f9a02410..a45973968 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -18,8 +18,6 @@
 
 namespace Kernel {
 
-KernelSystem* g_kernel;
-
 /// Initialize the kernel
 KernelSystem::KernelSystem(Memory::MemorySystem& memory, Core::Timing& timing,
                            std::function<void()> prepare_reschedule_callback, u32 system_mode)
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index c662882f5..6ca3267fb 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -292,6 +292,4 @@ private:
     void serialize(Archive& ar, const unsigned int file_version);
 };
 
-extern KernelSystem* g_kernel;
-
 } // namespace Kernel
diff --git a/src/core/hle/kernel/mutex.cpp b/src/core/hle/kernel/mutex.cpp
index b8a3d143b..16bcd3af2 100644
--- a/src/core/hle/kernel/mutex.cpp
+++ b/src/core/hle/kernel/mutex.cpp
@@ -12,6 +12,7 @@
 #include "core/hle/kernel/mutex.h"
 #include "core/hle/kernel/object.h"
 #include "core/hle/kernel/thread.h"
+#include "core/global.h"
 
 SERIALIZE_EXPORT_IMPL(Kernel::Mutex)
 
@@ -26,7 +27,7 @@ void ReleaseThreadMutexes(Thread* thread) {
     thread->held_mutexes.clear();
 }
 
-Mutex::Mutex() : kernel(*g_kernel) {}
+Mutex::Mutex() : kernel(Core::Global<KernelSystem>()) {}
 Mutex::~Mutex() {}
 
 std::shared_ptr<Mutex> KernelSystem::CreateMutex(bool initial_locked, std::string name) {
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp
index 5fad4fd85..72f882c56 100644
--- a/src/core/hle/kernel/process.cpp
+++ b/src/core/hle/kernel/process.cpp
@@ -18,6 +18,7 @@
 #include "core/hle/kernel/thread.h"
 #include "core/hle/kernel/vm_manager.h"
 #include "core/memory.h"
+#include "core/global.h"
 
 namespace Kernel {
 
@@ -427,7 +428,11 @@ ResultCode Process::Unmap(VAddr target, VAddr source, u32 size, VMAPermission pe
     return RESULT_SUCCESS;
 }
 
-Kernel::Process::Process() : kernel(*g_kernel), handle_table(*g_kernel), vm_manager(g_kernel->memory)
+Kernel::Process::Process() : Kernel::Process::Process(Core::Global<KernelSystem>())
+{
+}
+
+Kernel::Process::Process(KernelSystem& kernel) : kernel(kernel), handle_table(kernel), vm_manager(kernel.memory)
 {
     kernel.memory.RegisterPageTable(&vm_manager.page_table);
 }
diff --git a/src/core/hle/kernel/process.h b/src/core/hle/kernel/process.h
index edda20c1f..70a5f212b 100644
--- a/src/core/hle/kernel/process.h
+++ b/src/core/hle/kernel/process.h
@@ -143,7 +143,8 @@ private:
 
 class Process final : public Object {
 public:
-    explicit Process();
+    Process();
+    explicit Process(KernelSystem& kernel);
     ~Process() override;
 
     std::string GetTypeName() const override {
diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp
index f2ceb899e..146142f08 100644
--- a/src/core/hle/kernel/server_session.cpp
+++ b/src/core/hle/kernel/server_session.cpp
@@ -10,12 +10,13 @@
 #include "core/hle/kernel/server_session.h"
 #include "core/hle/kernel/session.h"
 #include "core/hle/kernel/thread.h"
+#include "core/global.h"
 
 SERIALIZE_EXPORT_IMPL(Kernel::ServerSession)
 
 namespace Kernel {
 
-ServerSession::ServerSession() : kernel(*g_kernel) {}
+ServerSession::ServerSession() : kernel(Core::Global<KernelSystem>()) {}
 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/thread.cpp b/src/core/hle/kernel/thread.cpp
index 409dcc886..98fe85175 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -24,6 +24,7 @@
 #include "core/hle/kernel/thread.h"
 #include "core/hle/result.h"
 #include "core/memory.h"
+#include "core/global.h"
 
 SERIALIZE_EXPORT_IMPL(Kernel::Thread)
 
@@ -66,8 +67,8 @@ u32 ThreadManager::NewThreadId() {
 }
 
 Thread::Thread()
-    : context(g_kernel->GetThreadManager().NewContext()),
-      thread_manager(g_kernel->GetThreadManager()) {}
+    : context(Core::Global<KernelSystem>().GetThreadManager().NewContext()),
+      thread_manager(Core::Global<KernelSystem>().GetThreadManager()) {}
 Thread::~Thread() {}
 
 Thread* ThreadManager::GetCurrentThread() const {
diff --git a/src/core/hle/kernel/timer.cpp b/src/core/hle/kernel/timer.cpp
index f073c3312..422cf990c 100644
--- a/src/core/hle/kernel/timer.cpp
+++ b/src/core/hle/kernel/timer.cpp
@@ -11,10 +11,11 @@
 #include "core/hle/kernel/object.h"
 #include "core/hle/kernel/thread.h"
 #include "core/hle/kernel/timer.h"
+#include "core/global.h"
 
 namespace Kernel {
 
-Timer::Timer() : kernel(*g_kernel), timer_manager(g_kernel->GetTimerManager()) {}
+Timer::Timer() : kernel(Core::Global<KernelSystem>()), timer_manager(Core::Global<KernelSystem>().GetTimerManager()) {}
 Timer::~Timer() {
     Cancel();
     timer_manager.timer_callback_table.erase(callback_id);
diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h
index 88a70bf10..771bbfb53 100644
--- a/src/core/hle/service/am/am.h
+++ b/src/core/hle/service/am/am.h
@@ -18,6 +18,7 @@
 #include "core/hle/kernel/mutex.h"
 #include "core/hle/result.h"
 #include "core/hle/service/service.h"
+#include "core/global.h"
 
 namespace Core {
 class System;
@@ -601,6 +602,6 @@ namespace boost::serialization {
     template <class Archive>
     inline void load_construct_data(Archive& ar, Service::AM::Module* t, const unsigned int)
     {
-        ::new(t)Service::AM::Module(*Kernel::g_kernel);
+        ::new(t)Service::AM::Module(Core::Global<Kernel::KernelSystem>());
     }
 }
diff --git a/src/video_core/pica.cpp b/src/video_core/pica.cpp
index 1475e3a92..0b5aaa682 100644
--- a/src/video_core/pica.cpp
+++ b/src/video_core/pica.cpp
@@ -8,6 +8,12 @@
 #include "video_core/pica_state.h"
 #include "video_core/renderer_base.h"
 #include "video_core/video_core.h"
+#include "core/global.h"
+
+namespace Core {
+    template <>
+    Pica::State& Global() { return Pica::g_state; }
+}
 
 namespace Pica {