| @@ -0,0 +1,54 @@ | |||
| /***************************************************************************** | |||
| Copyright 2018 The TensorFlow.NET Authors. All Rights Reserved. | |||
| Licensed under the Apache License, Version 2.0 (the "License"); | |||
| you may not use this file except in compliance with the License. | |||
| You may obtain a copy of the License at | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||
| ******************************************************************************/ | |||
| using System; | |||
| using System.Runtime.InteropServices; | |||
| namespace Tensorflow.Util | |||
| { | |||
| internal static class SafeHandleExtensions | |||
| { | |||
| /// <summary> | |||
| /// Acquires a lease on a safe handle. This method is intended to be used in the initializer of a <c>using</c> | |||
| /// statement. | |||
| /// </summary> | |||
| /// <param name="handle">The <see cref="SafeHandle"/> to lease.</param> | |||
| /// <returns>A <see cref="SafeHandleLease"/>, which must be disposed to release the resource.</returns> | |||
| /// <exception cref="ObjectDisposedException">If the lease could not be acquired.</exception> | |||
| public static SafeHandleLease Lease(this SafeHandle handle) | |||
| { | |||
| if (handle is null) | |||
| throw new ArgumentNullException(nameof(handle)); | |||
| var success = false; | |||
| try | |||
| { | |||
| handle.DangerousAddRef(ref success); | |||
| if (!success) | |||
| throw new ObjectDisposedException(handle.GetType().FullName); | |||
| return new SafeHandleLease(handle); | |||
| } | |||
| catch | |||
| { | |||
| if (success) | |||
| handle.DangerousRelease(); | |||
| throw; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,36 @@ | |||
| /***************************************************************************** | |||
| Copyright 2018 The TensorFlow.NET Authors. All Rights Reserved. | |||
| Licensed under the Apache License, Version 2.0 (the "License"); | |||
| you may not use this file except in compliance with the License. | |||
| You may obtain a copy of the License at | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||
| ******************************************************************************/ | |||
| using System; | |||
| using System.Runtime.InteropServices; | |||
| namespace Tensorflow.Util | |||
| { | |||
| /// <summary> | |||
| /// Represents a lease of a <see cref="SafeHandle"/>. | |||
| /// </summary> | |||
| /// <seealso cref="SafeHandleExtensions.Lease"/> | |||
| public readonly struct SafeHandleLease : IDisposable | |||
| { | |||
| private readonly SafeHandle _handle; | |||
| internal SafeHandleLease(SafeHandle handle) | |||
| => _handle = handle; | |||
| public void Dispose() | |||
| => _handle?.DangerousRelease(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,43 @@ | |||
| /***************************************************************************** | |||
| Copyright 2018 The TensorFlow.NET Authors. All Rights Reserved. | |||
| Licensed under the Apache License, Version 2.0 (the "License"); | |||
| you may not use this file except in compliance with the License. | |||
| You may obtain a copy of the License at | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||
| ******************************************************************************/ | |||
| using System; | |||
| using System.Runtime.InteropServices; | |||
| namespace Tensorflow.Util | |||
| { | |||
| public abstract class SafeTensorflowHandle : SafeHandle | |||
| { | |||
| private protected SafeTensorflowHandle() | |||
| : base(IntPtr.Zero, ownsHandle: true) | |||
| { | |||
| } | |||
| private protected SafeTensorflowHandle(IntPtr handle) | |||
| : base(IntPtr.Zero, ownsHandle: true) | |||
| { | |||
| SetHandle(handle); | |||
| } | |||
| private protected SafeTensorflowHandle(IntPtr handle, bool ownsHandle) | |||
| : base(IntPtr.Zero, ownsHandle) | |||
| { | |||
| SetHandle(handle); | |||
| } | |||
| public override bool IsInvalid => handle == IntPtr.Zero; | |||
| } | |||
| } | |||