From 6ce6af5fa0f25084d08a44a455aae5c01add0d71 Mon Sep 17 00:00:00 2001 From: Francesco Bertolaccini Date: Tue, 9 Feb 2016 11:21:08 +0100 Subject: [PATCH 1/2] Implement IDispose properly --- SharpPhysFS/Interop.cs | 37 +++++++++++++++++++++++++++++++++---- SharpPhysFS/PhysFS.cs | 18 +++++++++++++++++- 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/SharpPhysFS/Interop.cs b/SharpPhysFS/Interop.cs index cbf2d0c..891a271 100644 --- a/SharpPhysFS/Interop.cs +++ b/SharpPhysFS/Interop.cs @@ -99,6 +99,7 @@ namespace SharpPhysFS } class Interop + : IDisposable { [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void FnGetLinkedVersion(ref Version v); @@ -200,6 +201,11 @@ namespace SharpPhysFS : this($"{libname}.dll", $"{libname}.dylib", $"{libname}.so") { } + Func loadLibrary; + Func loadSymbol; + Func freeLibrary; + IntPtr library; + public Interop(string winlib, string maclib, string unixlib) { /* This method is used to dynamically load the physfs @@ -211,28 +217,27 @@ namespace SharpPhysFS * pointers from the loaded library */ - Func loadLibrary; - Func loadSymbol; string libraryName; - IntPtr library; - if (Environment.OSVersion.Platform == PlatformID.Win32NT) { loadLibrary = DynamicLoader.LoadLibrary; loadSymbol = DynamicLoader.GetProcAddress; + freeLibrary = DynamicLoader.FreeLibrary; libraryName = winlib; } else if(Environment.OSVersion.Platform == PlatformID.MacOSX) { loadLibrary = n => DynamicLoader.osx_dlopen(n, 1); loadSymbol = DynamicLoader.osx_dlsym; + freeLibrary = DynamicLoader.osx_dlclose; libraryName = maclib; } else { loadLibrary = n => DynamicLoader.unix_dlopen(n, 1); loadSymbol = DynamicLoader.unix_dlsym; + freeLibrary = DynamicLoader.unix_dlclose; libraryName = unixlib; } @@ -252,5 +257,29 @@ namespace SharpPhysFS field.SetValue(this, del); } } + + #region IDisposable Support + private bool disposedValue = false; // To detect redundant calls + + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + /*if (disposing) + { + // TODO: dispose managed state (managed objects). + }*/ + + freeLibrary(library); + + disposedValue = true; + } + } + + public void Dispose() + { + Dispose(true); + } + #endregion } } diff --git a/SharpPhysFS/PhysFS.cs b/SharpPhysFS/PhysFS.cs index dee5389..4778f94 100644 --- a/SharpPhysFS/PhysFS.cs +++ b/SharpPhysFS/PhysFS.cs @@ -693,9 +693,25 @@ namespace SharpPhysFS return new PhysFSStream(this, handle, false); } + bool disposed = false; + + protected virtual void Dispose(bool disposing) + { + if (!disposed) + { + if (disposing) + { + Deinit(); + interop.Dispose(); + } + + disposed = true; + } + } + public void Dispose() { - Deinit(); + Dispose(true); } } } From 54ebece97ee3eba11052d826b75162556bfafea6 Mon Sep 17 00:00:00 2001 From: Francesco Bertolaccini Date: Tue, 9 Feb 2016 11:25:48 +0100 Subject: [PATCH 2/2] Fix typo in docs --- SharpPhysFS/PhysFS.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharpPhysFS/PhysFS.cs b/SharpPhysFS/PhysFS.cs index 4778f94..33aeaad 100644 --- a/SharpPhysFS/PhysFS.cs +++ b/SharpPhysFS/PhysFS.cs @@ -662,7 +662,7 @@ namespace SharpPhysFS /// /// Get a file listing of a search path's directory, using an application-defined callback. /// - /// Type of data passed to callbakc + /// Type of data passed to callback /// Directory, in platform-independent notation, to enumerate. /// Callback function to notify about search path elements. /// Application-defined data passed to callback. Can be null.