From 93d7e9a669d71fa4802dda076ae7a2a4578f8e43 Mon Sep 17 00:00:00 2001 From: Eli Belash Date: Thu, 22 Aug 2019 19:45:54 +0300 Subject: [PATCH] DisposableObject: Revamped based on VS unmanaged resource pattern. --- src/TensorFlowNET.Core/DisposableObject.cs | 39 +++++++++++----------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/TensorFlowNET.Core/DisposableObject.cs b/src/TensorFlowNET.Core/DisposableObject.cs index 688ac92c..12bb8c3a 100644 --- a/src/TensorFlowNET.Core/DisposableObject.cs +++ b/src/TensorFlowNET.Core/DisposableObject.cs @@ -16,6 +16,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Text; namespace Tensorflow @@ -26,27 +27,32 @@ namespace Tensorflow public abstract class DisposableObject : IDisposable { protected IntPtr _handle; + protected bool _disposed; - protected DisposableObject() { } + [SuppressMessage("ReSharper", "UnusedMember.Global")] + protected DisposableObject() + { } - protected DisposableObject(IntPtr handle) + protected DisposableObject(IntPtr handle) => _handle = handle; private void internal_dispose(bool disposing) { + if (_disposed) + return; + + _disposed = true; + + //first handle managed, they might use the unmanaged resources. if (disposing) - { - // free unmanaged resources (unmanaged objects) and override a finalizer below. - if (_handle != IntPtr.Zero) - { - // dispose managed state (managed objects). - DisposeManagedResources(); + // dispose managed state (managed objects). + DisposeManagedResources(); - // set large fields to null. - DisposeUnmanagedResources(_handle); + if (_handle != IntPtr.Zero) + { + DisposeUnmanagedResources(_handle); - _handle = IntPtr.Zero; - } + _handle = IntPtr.Zero; } } @@ -55,27 +61,22 @@ namespace Tensorflow /// /// Equivalent to what you would perform inside protected virtual void DisposeManagedResources() - { - } + { } /// /// Dispose any unmanaged resources related to given . /// protected abstract void DisposeUnmanagedResources(IntPtr handle); - // override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources. ~DisposableObject() { - // Do not change this code. Put cleanup code in Dispose(bool disposing) above. internal_dispose(false); } - // This code added to correctly implement the disposable pattern. public void Dispose() { - // Do not change this code. Put cleanup code in Dispose(bool disposing) above. internal_dispose(true); - // uncomment the following line if the finalizer is overridden above. + GC.SuppressFinalize(this); } }