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

GroupDisposable.cs 1.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using System;
  2. using System.Buffers;
  3. using System.Collections.Generic;
  4. namespace LLama.Native;
  5. /// <summary>
  6. /// Disposes all contained disposables when this class is disposed
  7. /// </summary>
  8. internal sealed class GroupDisposable
  9. : IDisposable
  10. {
  11. private bool _disposed;
  12. private readonly List<MemoryHandle> _handles = new();
  13. private readonly List<IDisposable> _disposables = new();
  14. /// <inheritdoc />
  15. ~GroupDisposable()
  16. {
  17. Dispose();
  18. }
  19. public MemoryHandle Add(MemoryHandle handle)
  20. {
  21. if (_disposed)
  22. throw new ObjectDisposedException("Cannot add new handle, already disposed");
  23. _handles.Add(handle);
  24. return handle;
  25. }
  26. public T Add<T>(T disposable)
  27. where T : class, IDisposable
  28. {
  29. if (_disposed)
  30. throw new ObjectDisposedException("Cannot add new IDisposable, already disposed");
  31. _disposables.Add(disposable);
  32. return disposable;
  33. }
  34. /// <inheritdoc />
  35. public void Dispose()
  36. {
  37. if (_disposed)
  38. return;
  39. foreach (var memoryHandle in _handles)
  40. memoryHandle.Dispose();
  41. foreach (var disposable in _disposables)
  42. disposable.Dispose();
  43. _disposed = true;
  44. GC.SuppressFinalize(this);
  45. }
  46. }