From f49ac3a2d71f06d603b8401817a6dfd9dbc3c4bc Mon Sep 17 00:00:00 2001
From: bunnei <ericbunnie@gmail.com>
Date: Tue, 10 Jun 2014 22:43:50 -0400
Subject: [PATCH] Kernel: Added freeing of kernel objects on emulator shutdown.

---
 src/core/hle/kernel/kernel.cpp | 4 ++++
 src/core/hle/kernel/kernel.h   | 6 ++++++
 src/core/system.cpp            | 3 +++
 3 files changed, 13 insertions(+)

diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index e51a9d45a8..739ddd4ef0 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -132,12 +132,16 @@ Object* ObjectPool::CreateByIDType(int type) {
     }
 }
 
+/// Initialize the kernel
 void Init() {
     Kernel::ThreadingInit();
 }
 
+/// Shutdown the kernel
 void Shutdown() {
     Kernel::ThreadingShutdown();
+
+    g_object_pool.Clear(); // Free all kernel objects
 }
 
 /**
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index d2d624f6d4..3f15da0ace 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -167,6 +167,12 @@ private:
 extern ObjectPool g_object_pool;
 extern Handle g_main_thread;
 
+/// Initialize the kernel
+void Init();
+
+/// Shutdown the kernel
+void Shutdown();
+
 /**
  * Loads executable stored at specified address
  * @entry_point Entry point in memory of loaded executable
diff --git a/src/core/system.cpp b/src/core/system.cpp
index c77092327b..9b1e96888a 100644
--- a/src/core/system.cpp
+++ b/src/core/system.cpp
@@ -8,6 +8,7 @@
 #include "core/system.h"
 #include "core/hw/hw.h"
 #include "core/hle/hle.h"
+#include "core/hle/kernel/kernel.h"
 
 #include "video_core/video_core.h"
 
@@ -26,6 +27,7 @@ void Init(EmuWindow* emu_window) {
     HLE::Init();
     CoreTiming::Init();
     VideoCore::Init(emu_window);
+    Kernel::Init();
 }
 
 void RunLoopFor(int cycles) {
@@ -42,6 +44,7 @@ void Shutdown() {
     HLE::Shutdown();
     CoreTiming::Shutdown();
     VideoCore::Shutdown();
+    Kernel::Shutdown();
     g_ctr_file_system.Shutdown();
 }