Mailbox.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using System;
  2. using System.Collections.Concurrent;
  3. namespace Ryujinx.Audio.Renderer.Utils
  4. {
  5. /// <summary>
  6. /// A simple generic message queue for unmanaged types.
  7. /// </summary>
  8. /// <typeparam name="T">The target unmanaged type used</typeparam>
  9. public class Mailbox<T> : IDisposable where T : unmanaged
  10. {
  11. private BlockingCollection<T> _messageQueue;
  12. private BlockingCollection<T> _responseQueue;
  13. public Mailbox()
  14. {
  15. _messageQueue = new BlockingCollection<T>(1);
  16. _responseQueue = new BlockingCollection<T>(1);
  17. }
  18. public void SendMessage(T data)
  19. {
  20. _messageQueue.Add(data);
  21. }
  22. public void SendResponse(T data)
  23. {
  24. _responseQueue.Add(data);
  25. }
  26. public T ReceiveMessage()
  27. {
  28. return _messageQueue.Take();
  29. }
  30. public T ReceiveResponse()
  31. {
  32. return _responseQueue.Take();
  33. }
  34. public void Dispose()
  35. {
  36. Dispose(true);
  37. }
  38. protected virtual void Dispose(bool disposing)
  39. {
  40. if (disposing)
  41. {
  42. _messageQueue.Dispose();
  43. _responseQueue.Dispose();
  44. }
  45. }
  46. }
  47. }