From 2f2b60db4cc687a86cc2cc5aa9bbe5fcf202dc9b Mon Sep 17 00:00:00 2001
From: Stary 2001 <mctinfoilball@gmail.com>
Date: Sat, 10 Feb 2018 18:31:40 +0000
Subject: [PATCH] Make HSessionObj implement IDisposable (#10)

* Make HSessionObj implement IDisposable, so that objects that have handles created to them are disposed when the handles are closed.

* Spelling fix: GenertateObjectId -> GenerateObjectId
---
 Ryujinx/OsHle/Handles/HDomain.cs     |  2 +-
 Ryujinx/OsHle/Handles/HSessionObj.cs | 20 +++++++++++++++++++-
 Ryujinx/OsHle/Ipc/IpcHandler.cs      |  2 +-
 Ryujinx/OsHle/Objects/ObjHelper.cs   |  2 +-
 4 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/Ryujinx/OsHle/Handles/HDomain.cs b/Ryujinx/OsHle/Handles/HDomain.cs
index fd252f5d7..e781602a1 100644
--- a/Ryujinx/OsHle/Handles/HDomain.cs
+++ b/Ryujinx/OsHle/Handles/HDomain.cs
@@ -17,7 +17,7 @@ namespace Ryujinx.OsHle.Handles
             ObjIds = new IdPool();
         }
 
-        public int GenertateObjectId(object Obj)
+        public int GenerateObjectId(object Obj)
         {
             int Id = ObjIds.GenerateId();
 
diff --git a/Ryujinx/OsHle/Handles/HSessionObj.cs b/Ryujinx/OsHle/Handles/HSessionObj.cs
index c1e5e41a4..d2b2b0d78 100644
--- a/Ryujinx/OsHle/Handles/HSessionObj.cs
+++ b/Ryujinx/OsHle/Handles/HSessionObj.cs
@@ -1,6 +1,8 @@
+using System;
+
 namespace Ryujinx.OsHle.Handles
 {
-    class HSessionObj : HSession
+    class HSessionObj : HSession, IDisposable
     {
         public object Obj { get; private set; }
 
@@ -8,5 +10,21 @@ namespace Ryujinx.OsHle.Handles
         {
             this.Obj = Obj;
         }
+
+        public void Dispose()
+        {
+            Dispose(true);
+        }
+
+        protected virtual void Dispose(bool Disposing)
+        {
+            if(Disposing && Obj != null)
+            {
+                if(Obj is IDisposable DisposableObj)
+                {
+                    DisposableObj.Dispose();
+                }
+            }
+        }
     }
 }
\ No newline at end of file
diff --git a/Ryujinx/OsHle/Ipc/IpcHandler.cs b/Ryujinx/OsHle/Ipc/IpcHandler.cs
index ff90d873b..c373d2cef 100644
--- a/Ryujinx/OsHle/Ipc/IpcHandler.cs
+++ b/Ryujinx/OsHle/Ipc/IpcHandler.cs
@@ -212,7 +212,7 @@ namespace Ryujinx.OsHle.Ipc
 
             Ns.Os.Handles.ReplaceData(HndId, Dom);
 
-            return FillResponse(Response, 0, Dom.GenertateObjectId(Dom));
+            return FillResponse(Response, 0, Dom.GenerateObjectId(Dom));
         }
 
         private static IpcMessage IpcDuplicateSessionEx(
diff --git a/Ryujinx/OsHle/Objects/ObjHelper.cs b/Ryujinx/OsHle/Objects/ObjHelper.cs
index e37f5320e..bab222032 100644
--- a/Ryujinx/OsHle/Objects/ObjHelper.cs
+++ b/Ryujinx/OsHle/Objects/ObjHelper.cs
@@ -9,7 +9,7 @@ namespace Ryujinx.OsHle.Objects
         {
             if (Context.Session is HDomain Dom)
             {
-                Context.Response.ResponseObjIds.Add(Dom.GenertateObjectId(Obj));
+                Context.Response.ResponseObjIds.Add(Dom.GenerateObjectId(Obj));
             }
             else
             {