You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
2.0 KiB

// License: Apache 2.0. See LICENSE file in root directory.
// Copyright(c) 2017 Intel Corporation. All Rights Reserved.
namespace Intel.RealSense.Base
{
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security;
[SuppressUnmanagedCodeSecurity]
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void Deleter(IntPtr ptr);
/// <summary>
/// Native handle with deleter delegate to release unmanaged resources
/// </summary>
// TODO: CriticalFinalizerObject & CER
//[DebuggerDisplay("{deleter?.Method.Name,nq}", Name = nameof(Deleter))]
internal sealed class DeleterHandle : IDisposable
{
private IntPtr handle;
private Deleter deleter;
public IntPtr Handle => handle;
/// <summary>
/// Gets a value indicating whether this handle is invalid
/// </summary>
public bool IsInvalid => handle == IntPtr.Zero;
public DeleterHandle(IntPtr ptr, Deleter deleter)
{
handle = ptr;
this.deleter = deleter;
}
public void SetHandleAsInvalid()
{
handle = IntPtr.Zero;
GC.SuppressFinalize(this);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public void Dispose(bool disposing)
{
if (handle == IntPtr.Zero)
{
return;
}
deleter?.Invoke(handle);
handle = IntPtr.Zero;
}
internal void Reset(IntPtr ptr)
{
handle = ptr;
GC.ReRegisterForFinalize(this);
}
internal void Reset(IntPtr ptr, Deleter deleter)
{
this.handle = ptr;
this.deleter = deleter;
//GC.ReRegisterForFinalize(this);
}
~DeleterHandle()
{
//Console.WriteLine($"~{handle} {deleter?.Method}");
Dispose(false);
}
}
}