From bd18f5db17c7586d1be4d7eef18a214eeaf866ff Mon Sep 17 00:00:00 2001 From: Eli Belash Date: Tue, 27 Aug 2019 23:36:10 +0300 Subject: [PATCH] Removed all use-cases of Marshal.PtrToStructure in favor of unsafe ptrs. --- src/TensorFlowNET.Core/DisposableObject.cs | 1 - src/TensorFlowNET.Core/Graphs/Graph.Import.cs | 9 ++++----- src/TensorFlowNET.Core/Graphs/Graph.Operation.cs | 10 +++++++--- src/TensorFlowNET.Core/Graphs/Graph.cs | 12 ++++++------ .../Operations/Operation.Output.cs | 8 +++----- .../Sessions/c_api.tf_session_helper.cs | 12 ++++++++---- 6 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/TensorFlowNET.Core/DisposableObject.cs b/src/TensorFlowNET.Core/DisposableObject.cs index c9bf8875..53a15abc 100644 --- a/src/TensorFlowNET.Core/DisposableObject.cs +++ b/src/TensorFlowNET.Core/DisposableObject.cs @@ -54,7 +54,6 @@ namespace Tensorflow if (_handle != IntPtr.Zero) { DisposeUnmanagedResources(_handle); - _handle = IntPtr.Zero; } } diff --git a/src/TensorFlowNET.Core/Graphs/Graph.Import.cs b/src/TensorFlowNET.Core/Graphs/Graph.Import.cs index 82695527..0b2dc0e6 100644 --- a/src/TensorFlowNET.Core/Graphs/Graph.Import.cs +++ b/src/TensorFlowNET.Core/Graphs/Graph.Import.cs @@ -30,11 +30,10 @@ namespace Tensorflow var return_output_handle = Marshal.AllocHGlobal(size * num_return_outputs); c_api.TF_GraphImportGraphDefWithReturnOutputs(_handle, graph_def, opts, return_output_handle, num_return_outputs, s); - for (int i = 0; i < num_return_outputs; i++) - { - var handle = return_output_handle + i * size; - return_outputs[i] = Marshal.PtrToStructure(handle); - } + + var tf_output_ptr = (TF_Output*) return_output_handle; + for (int i = 0; i < num_return_outputs; i++) + return_outputs[i] = *(tf_output_ptr + i); Marshal.FreeHGlobal(return_output_handle); diff --git a/src/TensorFlowNET.Core/Graphs/Graph.Operation.cs b/src/TensorFlowNET.Core/Graphs/Graph.Operation.cs index 436afcc9..ded3ca9c 100644 --- a/src/TensorFlowNET.Core/Graphs/Graph.Operation.cs +++ b/src/TensorFlowNET.Core/Graphs/Graph.Operation.cs @@ -39,16 +39,20 @@ namespace Tensorflow return c_api.TF_NewOperation(_handle, opType, opName); } - public unsafe Operation[] ReturnOperations(IntPtr results) + public Operation[] ReturnOperations(IntPtr results) { TF_Operation return_oper_handle = new TF_Operation(); int num_return_opers = 0; c_api.TF_ImportGraphDefResultsReturnOperations(results, ref num_return_opers, ref return_oper_handle); Operation[] return_opers = new Operation[num_return_opers]; + var tf_op_size = Marshal.SizeOf(); for (int i = 0; i < num_return_opers; i++) { - var handle = return_oper_handle.node + Marshal.SizeOf() * i; - return_opers[i] = new Operation(*(IntPtr*)handle); + unsafe + { + var handle = return_oper_handle.node + tf_op_size * i; + return_opers[i] = new Operation(*(IntPtr*)handle); + } } return return_opers; diff --git a/src/TensorFlowNET.Core/Graphs/Graph.cs b/src/TensorFlowNET.Core/Graphs/Graph.cs index 38c35385..0dfb68db 100644 --- a/src/TensorFlowNET.Core/Graphs/Graph.cs +++ b/src/TensorFlowNET.Core/Graphs/Graph.cs @@ -369,7 +369,7 @@ namespace Tensorflow var name_key = name.ToLower(); int i = 0; if (_names_in_use.ContainsKey(name_key)) - i = _names_in_use[name_key]; + i = _names_in_use[name_key]; // Increment the number for "name_key". if (mark_as_used) _names_in_use[name_key] = i + 1; @@ -399,13 +399,13 @@ namespace Tensorflow int num_return_outputs = 0; c_api.TF_ImportGraphDefResultsReturnOutputs(results, ref num_return_outputs, ref return_output_handle); TF_Output[] return_outputs = new TF_Output[num_return_outputs]; - for (int i = 0; i < num_return_outputs; i++) + unsafe { - var handle = return_output_handle + (Marshal.SizeOf() * i); - return_outputs[i] = Marshal.PtrToStructure(handle); + var tf_output_ptr = (TF_Output*) return_output_handle; + for (int i = 0; i < num_return_outputs; i++) + return_outputs[i] = *(tf_output_ptr + i); + return return_outputs; } - - return return_outputs; } public string[] get_all_collection_keys() diff --git a/src/TensorFlowNET.Core/Operations/Operation.Output.cs b/src/TensorFlowNET.Core/Operations/Operation.Output.cs index 24348322..62c8f378 100644 --- a/src/TensorFlowNET.Core/Operations/Operation.Output.cs +++ b/src/TensorFlowNET.Core/Operations/Operation.Output.cs @@ -50,14 +50,12 @@ namespace Tensorflow public unsafe TF_Input[] OutputConsumers(int index, int max_consumers) { - int size = Marshal.SizeOf(); - var handle = Marshal.AllocHGlobal(size); + var handle = Marshal.AllocHGlobal(Marshal.SizeOf()); int num = c_api.TF_OperationOutputConsumers(new TF_Output(_handle, index), handle, max_consumers); var consumers = new TF_Input[num]; + var inputptr = (TF_Input*) handle; for (int i = 0; i < num; i++) - { - consumers[i] = Marshal.PtrToStructure(handle + i * size); - } + consumers[i] = *(inputptr + i); return consumers; } diff --git a/src/TensorFlowNET.Core/Sessions/c_api.tf_session_helper.cs b/src/TensorFlowNET.Core/Sessions/c_api.tf_session_helper.cs index c40b2a00..6cbf4eec 100644 --- a/src/TensorFlowNET.Core/Sessions/c_api.tf_session_helper.cs +++ b/src/TensorFlowNET.Core/Sessions/c_api.tf_session_helper.cs @@ -27,13 +27,17 @@ namespace Tensorflow var handle = Marshal.AllocHGlobal(size * num_consumers); int num = TF_OperationOutputConsumers(oper_out, handle, num_consumers); var consumers = new string[num_consumers]; - for (int i = 0; i < num; i++) + unsafe { - TF_Input input = Marshal.PtrToStructure(handle + i * size); - consumers[i] = Marshal.PtrToStringAnsi(TF_OperationName(input.oper)); + var inputptr = (TF_Input*) handle; + for (int i = 0; i < num; i++) + { + var oper = (inputptr + i)->oper; + consumers[i] = Marshal.PtrToStringAnsi(TF_OperationName(oper)); + } } return consumers; } } -} +} \ No newline at end of file