diff --git a/nng.NET/AsyncContext.cs b/nng.NET/AsyncContext.cs index 8894a8d..4b7da11 100644 --- a/nng.NET/AsyncContext.cs +++ b/nng.NET/AsyncContext.cs @@ -174,10 +174,24 @@ protected void HandleFailedSend() protected object sync = new object(); #region IDisposable - public void Dispose() + public void Dispose() => Dispose(true); + + protected virtual void Dispose(bool disposing) { - Aio?.Dispose(); + if (disposed) + return; + + if (disposing) + { + Aio?.Dispose(); + } + + // No unmanaged resources to cleanup + + disposed = true; } + + bool disposed = false; #endregion } @@ -253,12 +267,19 @@ protected virtual void Dispose(bool disposing) { if (disposed) return; + if (disposing) { - var _ = nng_ctx_close(NativeNngStruct); + // No managed resources to dispose } + + var _ = nng_ctx_close(NativeNngStruct); + disposed = true; } + + ~NngCtx() => Dispose(false); + bool disposed = false; #endregion } diff --git a/nng.NET/Dialer.cs b/nng.NET/Dialer.cs index f384c37..05259f4 100644 --- a/nng.NET/Dialer.cs +++ b/nng.NET/Dialer.cs @@ -82,12 +82,19 @@ protected virtual void Dispose(bool disposing) { if (disposed) return; + if (disposing) { - int _ = nng_dialer_close(NativeNngStruct); + // No managed resources to dispose } + + int _ = nng_dialer_close(NativeNngStruct); + disposed = true; } + + ~NngDialer() => Dispose(false); + bool disposed = false; #endregion diff --git a/nng.NET/Listener.cs b/nng.NET/Listener.cs index 5249235..76ca7c9 100644 --- a/nng.NET/Listener.cs +++ b/nng.NET/Listener.cs @@ -84,12 +84,19 @@ protected virtual void Dispose(bool disposing) { if (disposed) return; + if (disposing) { - int _ = nng_listener_close(NativeNngStruct); + // No managed resources to dispose } + + int _ = nng_listener_close(NativeNngStruct); + disposed = true; } + + ~NngListener() => Dispose(false); + bool disposed = false; #endregion diff --git a/nng.NET/Memory.cs b/nng.NET/Memory.cs index 83727c4..ed5222f 100644 --- a/nng.NET/Memory.cs +++ b/nng.NET/Memory.cs @@ -40,7 +40,7 @@ public void Take() Ptr = default; Length = default; } - + #region IDisposable public void Dispose() { @@ -52,13 +52,20 @@ protected virtual void Dispose(bool disposing) { if (disposed) return; + if (disposing) { - if (Ptr != IntPtr.Zero) - nng_free(Ptr, Length); + // No managed resources to dispose } + + if (Ptr != IntPtr.Zero) + nng_free(Ptr, Length); + disposed = true; } + + ~NngAlloc() => Dispose(false); + bool disposed = false; #endregion } diff --git a/nng.NET/Socket.cs b/nng.NET/Socket.cs index b80fdea..8cdeefa 100644 --- a/nng.NET/Socket.cs +++ b/nng.NET/Socket.cs @@ -175,12 +175,19 @@ protected virtual void Dispose(bool disposing) { if (disposed) return; + if (disposing) { - int _ = nng_close(NativeNngStruct); + // No managed resources to dispose } + + int _ = nng_close(NativeNngStruct); + disposed = true; } + + ~NngSocket() => Dispose(false); + bool disposed = false; #endregion } diff --git a/nng.NET/Stats.cs b/nng.NET/Stats.cs index b9f0f1e..ca21e54 100644 --- a/nng.NET/Stats.cs +++ b/nng.NET/Stats.cs @@ -35,10 +35,7 @@ public static NngResult GetStatSnapshot() var res = nng_stats_get(out nng_stat statsp); return NngResult.OkThen(res, () => new StatRoot { NativeNngStruct = statsp }); } - } - public class StatRoot : NngStat, IStatRoot - { #region IDisposable public void Dispose() { @@ -52,14 +49,23 @@ protected virtual void Dispose(bool disposing) return; if (disposing) { - nng_stats_free(NativeNngStruct); + // No managed resources to dispose } + nng_stats_free(NativeNngStruct); disposed = true; } + + ~NngStat() => Dispose(false); + bool disposed = false; #endregion } + public class StatRoot : NngStat, IStatRoot + { + + } + public class StatChild : NngStat, IStatChild { public static IStatChild Create(nng_stat stat) diff --git a/nng.NET/String.cs b/nng.NET/String.cs index a67f496..a37f934 100644 --- a/nng.NET/String.cs +++ b/nng.NET/String.cs @@ -40,11 +40,13 @@ protected virtual void Dispose(bool disposing) return; if (disposing) { - if (Ptr != IntPtr.Zero) - nng_strfree(Ptr); + // No managed resources to dispose } + if (Ptr != IntPtr.Zero) + nng_strfree(Ptr); disposed = true; } + ~NngString() => Dispose(false); bool disposed = false; #endregion }