| @@ -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; | |||||
| } | |||||
| } | |||||