// 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);
///
/// Native handle with deleter delegate to release unmanaged resources
///
// 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;
///
/// Gets a value indicating whether this handle is invalid
///
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);
}
}
}