Browse Source

Refactored DisposableObject

tags/v0.12
Eli Belash 6 years ago
parent
commit
891346e4e3
11 changed files with 44 additions and 42 deletions
  1. +1
    -1
      src/TensorFlowNET.Core/APIs/c_api.cs
  2. +5
    -9
      src/TensorFlowNET.Core/Binding.Util.cs
  3. +1
    -1
      src/TensorFlowNET.Core/Buffers/Buffer.cs
  4. +23
    -18
      src/TensorFlowNET.Core/DisposableObject.cs
  5. +2
    -1
      src/TensorFlowNET.Core/Eager/ContextOptions.cs
  6. +2
    -2
      src/TensorFlowNET.Core/Graphs/Graph.cs
  7. +1
    -1
      src/TensorFlowNET.Core/Graphs/ImportGraphDefOptions.cs
  8. +1
    -1
      src/TensorFlowNET.Core/Sessions/BaseSession.cs
  9. +1
    -1
      src/TensorFlowNET.Core/Sessions/SessionOptions.cs
  10. +3
    -3
      src/TensorFlowNET.Core/Status/Status.cs
  11. +4
    -4
      src/TensorFlowNET.Core/Tensors/Tensor.cs

+ 1
- 1
src/TensorFlowNET.Core/APIs/c_api.cs View File

@@ -59,6 +59,6 @@ namespace Tensorflow
} }


[DllImport(TensorFlowLibName)] [DllImport(TensorFlowLibName)]
public static unsafe extern IntPtr TF_Version();
public static extern IntPtr TF_Version();
} }
} }

+ 5
- 9
src/TensorFlowNET.Core/Binding.Util.cs View File

@@ -308,15 +308,14 @@ namespace Tensorflow
public static IEnumerable TupleToEnumerable(object tuple) public static IEnumerable TupleToEnumerable(object tuple)
{ {
Type t = tuple.GetType(); Type t = tuple.GetType();
if(t.IsGenericType && (t.FullName.StartsWith("System.Tuple") || t.FullName.StartsWith("System.ValueTuple")))
if (t.IsGenericType && (t.FullName.StartsWith("System.Tuple") || t.FullName.StartsWith("System.ValueTuple")))
{ {
var flds = t.GetFields(); var flds = t.GetFields();
for(int i = 0; i < flds.Length;i++)
for (int i = 0; i < flds.Length; i++)
{ {
yield return flds[i].GetValue(tuple); yield return flds[i].GetValue(tuple);
} }
}
else
} else
{ {
throw new System.Exception("Expected Tuple."); throw new System.Exception("Expected Tuple.");
} }
@@ -329,12 +328,9 @@ namespace Tensorflow


public static bool isinstance(object Item1, object tuple) public static bool isinstance(object Item1, object tuple)
{ {
var tup = TupleToEnumerable(tuple);
foreach(var t in tup)
{
if(isinstance(Item1, (Type)t))
foreach (var t in TupleToEnumerable(tuple))
if (isinstance(Item1, (Type) t))
return true; return true;
}
return false; return false;
} }
} }


+ 1
- 1
src/TensorFlowNET.Core/Buffers/Buffer.cs View File

@@ -66,7 +66,7 @@ namespace Tensorflow
return buffer.Data; return buffer.Data;
} }


protected override void DisposeUnManagedState(IntPtr handle)
protected override void DisposeUnmanagedResources(IntPtr handle)
=> c_api.TF_DeleteBuffer(handle); => c_api.TF_DeleteBuffer(handle);
} }
} }

+ 23
- 18
src/TensorFlowNET.Core/DisposableObject.cs View File

@@ -29,49 +29,54 @@ namespace Tensorflow


protected DisposableObject() { } protected DisposableObject() { }


public DisposableObject(IntPtr handle)
{
_handle = handle;
}

protected virtual void DisposeManagedState()
{
}

protected abstract void DisposeUnManagedState(IntPtr handle);
protected DisposableObject(IntPtr handle)
=> _handle = handle;


protected virtual void Dispose(bool disposing)
private void internal_dispose(bool disposing)
{ {
if (disposing) if (disposing)
{ {
// dispose managed state (managed objects).
DisposeManagedResources();

// free unmanaged resources (unmanaged objects) and override a finalizer below. // free unmanaged resources (unmanaged objects) and override a finalizer below.
if (_handle != IntPtr.Zero) if (_handle != IntPtr.Zero)
{ {
// dispose managed state (managed objects).
DisposeManagedState();

// set large fields to null. // set large fields to null.
DisposeUnManagedState(_handle);
DisposeUnmanagedResources(_handle);


_handle = IntPtr.Zero; _handle = IntPtr.Zero;
} }
} }
} }


/// <summary>
/// Dispose any managed resources.
/// </summary>
/// <remarks>Equivalent to what you would perform inside <see cref="Dispose()"/></remarks>
protected virtual void DisposeManagedResources()
{
}

/// <summary>
/// Dispose any unmanaged resources related to given <paramref name="handle"/>.
/// </summary>
protected abstract void DisposeUnmanagedResources(IntPtr handle);

// override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources. // override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources.
~DisposableObject() ~DisposableObject()
{ {
// Do not change this code. Put cleanup code in Dispose(bool disposing) above. // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
Dispose(false);
internal_dispose(false);
} }


// This code added to correctly implement the disposable pattern. // This code added to correctly implement the disposable pattern.
public void Dispose() public void Dispose()
{ {
// Do not change this code. Put cleanup code in Dispose(bool disposing) above. // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
Dispose(true);
internal_dispose(true);
// uncomment the following line if the finalizer is overridden above. // uncomment the following line if the finalizer is overridden above.
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
} }
} }
}
}

+ 2
- 1
src/TensorFlowNET.Core/Eager/ContextOptions.cs View File

@@ -1,8 +1,9 @@
using System; using System;
using System.IO;


namespace Tensorflow.Eager namespace Tensorflow.Eager
{ {
public class ContextOptions : IDisposable
public class ContextOptions : IDisposable //TODO! Eli: Shouldn't this inherieting DisposableObject?
{ {
private IntPtr _handle; private IntPtr _handle;




+ 2
- 2
src/TensorFlowNET.Core/Graphs/Graph.cs View File

@@ -439,12 +439,12 @@ namespace Tensorflow
_unfetchable_ops.Add(op); _unfetchable_ops.Add(op);
} }
protected override void DisposeManagedState()
protected override void DisposeManagedResources()
{ {
ops.default_graph_stack.remove(this); ops.default_graph_stack.remove(this);
} }
protected override void DisposeUnManagedState(IntPtr handle)
protected override void DisposeUnmanagedResources(IntPtr handle)
{ {
c_api.TF_DeleteGraph(handle); c_api.TF_DeleteGraph(handle);
} }


+ 1
- 1
src/TensorFlowNET.Core/Graphs/ImportGraphDefOptions.cs View File

@@ -37,7 +37,7 @@ namespace Tensorflow
c_api.TF_ImportGraphDefOptionsAddReturnOutput(_handle, name, index); c_api.TF_ImportGraphDefOptionsAddReturnOutput(_handle, name, index);
} }


protected override void DisposeUnManagedState(IntPtr handle)
protected override void DisposeUnmanagedResources(IntPtr handle)
=> c_api.TF_DeleteImportGraphDefOptions(handle); => c_api.TF_DeleteImportGraphDefOptions(handle);


public static implicit operator IntPtr(ImportGraphDefOptions opts) => opts._handle; public static implicit operator IntPtr(ImportGraphDefOptions opts) => opts._handle;


+ 1
- 1
src/TensorFlowNET.Core/Sessions/BaseSession.cs View File

@@ -396,7 +396,7 @@ namespace Tensorflow
Dispose(); Dispose();
} }
protected override void DisposeUnManagedState(IntPtr handle)
protected override void DisposeUnmanagedResources(IntPtr handle)
{ {
using (var status = new Status()) using (var status = new Status())
{ {


+ 1
- 1
src/TensorFlowNET.Core/Sessions/SessionOptions.cs View File

@@ -32,7 +32,7 @@ namespace Tensorflow
_handle = handle; _handle = handle;
} }


protected override void DisposeUnManagedState(IntPtr handle)
protected override void DisposeUnmanagedResources(IntPtr handle)
=> c_api.TF_DeleteSessionOptions(handle); => c_api.TF_DeleteSessionOptions(handle);


public void SetConfig(ConfigProto config) public void SetConfig(ConfigProto config)


+ 3
- 3
src/TensorFlowNET.Core/Status/Status.cs View File

@@ -50,7 +50,7 @@ namespace Tensorflow
/// </summary> /// </summary>
public void Check(bool throwException = false) public void Check(bool throwException = false)
{ {
if(Code != TF_Code.TF_OK)
if (Code != TF_Code.TF_OK)
{ {
Console.WriteLine(Message); Console.WriteLine(Message);
if (throwException) if (throwException)
@@ -65,7 +65,7 @@ namespace Tensorflow
return status._handle; return status._handle;
} }


protected override void DisposeUnManagedState(IntPtr handle)
protected override void DisposeUnmanagedResources(IntPtr handle)
=> c_api.TF_DeleteStatus(handle); => c_api.TF_DeleteStatus(handle);
} }
}
}

+ 4
- 4
src/TensorFlowNET.Core/Tensors/Tensor.cs View File

@@ -392,11 +392,11 @@ namespace Tensorflow
return $"tf.Tensor '{name}' shape=({string.Join(",", shape)}) dtype={dtype}"; return $"tf.Tensor '{name}' shape=({string.Join(",", shape)}) dtype={dtype}";
} }


protected override void DisposeManagedState()
{
}
//protected override void DisposeManagedState()
//{
//}


protected override void DisposeUnManagedState(IntPtr handle)
protected override void DisposeUnmanagedResources(IntPtr handle)
{ {
if(handle != IntPtr.Zero) if(handle != IntPtr.Zero)
{ {


Loading…
Cancel
Save