CallbackBase.cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // Copyright (c) The Avalonia Project. All rights reserved.
  2. // Licensed under the MIT license. See licence.md file in the project root for full license information.
  3. using System;
  4. using SharpGen.Runtime;
  5. namespace Avalonia.Native
  6. {
  7. public class CallbackBase : SharpGen.Runtime.IUnknown
  8. {
  9. private uint _refCount;
  10. private bool _disposed;
  11. private readonly object _lock = new object();
  12. private ShadowContainer _shadow;
  13. public CallbackBase()
  14. {
  15. _refCount = 1;
  16. }
  17. public ShadowContainer Shadow
  18. {
  19. get => _shadow;
  20. set
  21. {
  22. lock (_lock)
  23. {
  24. if (_disposed && value != null)
  25. {
  26. throw new ObjectDisposedException("CallbackBase");
  27. }
  28. _shadow = value;
  29. }
  30. }
  31. }
  32. public uint AddRef()
  33. {
  34. lock (_lock)
  35. {
  36. return ++_refCount;
  37. }
  38. }
  39. public void Dispose()
  40. {
  41. lock (_lock)
  42. {
  43. if (!_disposed)
  44. {
  45. _disposed = true;
  46. Release();
  47. }
  48. }
  49. }
  50. public uint Release()
  51. {
  52. lock (_lock)
  53. {
  54. _refCount--;
  55. if (_refCount == 0)
  56. {
  57. Shadow?.Dispose();
  58. Shadow = null;
  59. Destroyed();
  60. }
  61. return _refCount;
  62. }
  63. }
  64. protected virtual void Destroyed()
  65. {
  66. }
  67. }
  68. }