15 changed files with 73 additions and 115 deletions
@ -0,0 +1,53 @@ |
|||
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(); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue