瀏覽代碼

Ryujinx.Tests.Unicorn: Implement IDisposable (#3794)

Dispose unicorn when done
merry 3 年之前
父節點
當前提交
eafadf10c7

+ 18 - 2
Ryujinx.Tests.Unicorn/UnicornAArch32.cs

@@ -3,9 +3,10 @@ using System;
 
 
 namespace Ryujinx.Tests.Unicorn
 namespace Ryujinx.Tests.Unicorn
 {
 {
-    public class UnicornAArch32
+    public class UnicornAArch32 : IDisposable
     {
     {
         internal readonly IntPtr uc;
         internal readonly IntPtr uc;
+        private bool _isDisposed = false;
 
 
         public IndexedProperty<int, uint> R
         public IndexedProperty<int, uint> R
         {
         {
@@ -107,7 +108,22 @@ namespace Ryujinx.Tests.Unicorn
 
 
         ~UnicornAArch32()
         ~UnicornAArch32()
         {
         {
-            Interface.Checked(Native.Interface.uc_close(uc));
+            Dispose(false);
+        }
+
+        public void Dispose()
+        {
+            Dispose(true);
+            GC.SuppressFinalize(this);
+        }
+
+        protected virtual void Dispose(bool disposing)
+        {
+            if (!_isDisposed)
+            {
+                Interface.Checked(Native.Interface.uc_close(uc));
+                _isDisposed = true;
+            }
         }
         }
 
 
         public void RunForCount(ulong count)
         public void RunForCount(ulong count)

+ 18 - 2
Ryujinx.Tests.Unicorn/UnicornAArch64.cs

@@ -3,9 +3,10 @@ using System;
 
 
 namespace Ryujinx.Tests.Unicorn
 namespace Ryujinx.Tests.Unicorn
 {
 {
-    public class UnicornAArch64
+    public class UnicornAArch64 : IDisposable
     {
     {
         internal readonly IntPtr uc;
         internal readonly IntPtr uc;
+        private bool _isDisposed = false;
 
 
         public IndexedProperty<int, ulong> X
         public IndexedProperty<int, ulong> X
         {
         {
@@ -96,7 +97,22 @@ namespace Ryujinx.Tests.Unicorn
 
 
         ~UnicornAArch64()
         ~UnicornAArch64()
         {
         {
-            Interface.Checked(Native.Interface.uc_close(uc));
+            Dispose(false);
+        }
+
+        public void Dispose()
+        {
+            Dispose(true);
+            GC.SuppressFinalize(this);
+        }
+
+        protected virtual void Dispose(bool disposing)
+        {
+            if (!_isDisposed)
+            {
+                Interface.Checked(Native.Interface.uc_close(uc));
+                _isDisposed = true;
+            }
         }
         }
 
 
         public void RunForCount(ulong count)
         public void RunForCount(ulong count)

+ 6 - 0
Ryujinx.Tests/Cpu/CpuTest.cs

@@ -80,6 +80,12 @@ namespace Ryujinx.Tests.Cpu
         [TearDown]
         [TearDown]
         public void Teardown()
         public void Teardown()
         {
         {
+            if (_unicornAvailable)
+            {
+                _unicornEmu.Dispose();
+                _unicornEmu = null;
+            }
+
             _memory.DecrementReferenceCount();
             _memory.DecrementReferenceCount();
             _context.Dispose();
             _context.Dispose();
             _ram.Dispose();
             _ram.Dispose();

+ 6 - 0
Ryujinx.Tests/Cpu/CpuTest32.cs

@@ -76,6 +76,12 @@ namespace Ryujinx.Tests.Cpu
         [TearDown]
         [TearDown]
         public void Teardown()
         public void Teardown()
         {
         {
+            if (_unicornAvailable)
+            {
+                _unicornEmu.Dispose();
+                _unicornEmu = null;
+            }
+
             _memory.DecrementReferenceCount();
             _memory.DecrementReferenceCount();
             _context.Dispose();
             _context.Dispose();
             _ram.Dispose();
             _ram.Dispose();