csharpc-sharpdotnetxamlavaloniauicross-platformcross-platform-xamlavaloniaguimulti-platformuser-interfacedotnetcore
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.
55 lines
1.3 KiB
55 lines
1.3 KiB
using MicroCom.Runtime;
|
|
|
|
namespace Avalonia.MicroCom
|
|
{
|
|
public abstract class CallbackBase : IUnknown, IMicroComShadowContainer
|
|
{
|
|
private readonly object _lock = new object();
|
|
private bool _referencedFromManaged = true;
|
|
private bool _referencedFromNative = false;
|
|
private bool _destroyed;
|
|
|
|
public bool IsDestroyed => _destroyed;
|
|
|
|
protected virtual void Destroyed()
|
|
{
|
|
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
lock (_lock)
|
|
{
|
|
_referencedFromManaged = false;
|
|
DestroyIfNeeded();
|
|
}
|
|
}
|
|
|
|
void DestroyIfNeeded()
|
|
{
|
|
if(_destroyed)
|
|
return;
|
|
if (_referencedFromManaged == false && _referencedFromNative == false)
|
|
{
|
|
_destroyed = true;
|
|
Destroyed();
|
|
}
|
|
}
|
|
|
|
public MicroComShadow Shadow { get; set; }
|
|
public void OnReferencedFromNative()
|
|
{
|
|
lock (_lock)
|
|
_referencedFromNative = true;
|
|
}
|
|
|
|
public void OnUnreferencedFromNative()
|
|
{
|
|
lock (_lock)
|
|
{
|
|
_referencedFromNative = false;
|
|
DestroyIfNeeded();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|