TranslatorQueue.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using System.Collections.Concurrent;
  2. using System.Threading;
  3. namespace ChocolArm64.Translation
  4. {
  5. class TranslatorQueue
  6. {
  7. //This is the maximum number of functions to be translated that the queue can hold.
  8. //The value may need some tuning to find the sweet spot.
  9. private const int MaxQueueSize = 1024;
  10. private ConcurrentStack<TranslatorQueueItem>[] _translationQueue;
  11. private ManualResetEvent _queueDataReceivedEvent;
  12. private bool _signaled;
  13. public TranslatorQueue()
  14. {
  15. _translationQueue = new ConcurrentStack<TranslatorQueueItem>[(int)TranslationTier.Count];
  16. for (int prio = 0; prio < _translationQueue.Length; prio++)
  17. {
  18. _translationQueue[prio] = new ConcurrentStack<TranslatorQueueItem>();
  19. }
  20. _queueDataReceivedEvent = new ManualResetEvent(false);
  21. }
  22. public void Enqueue(TranslatorQueueItem item)
  23. {
  24. ConcurrentStack<TranslatorQueueItem> queue = _translationQueue[(int)item.Tier];
  25. if (queue.Count >= MaxQueueSize)
  26. {
  27. queue.TryPop(out _);
  28. }
  29. queue.Push(item);
  30. _queueDataReceivedEvent.Set();
  31. }
  32. public bool TryDequeue(out TranslatorQueueItem item)
  33. {
  34. for (int prio = 0; prio < _translationQueue.Length; prio++)
  35. {
  36. if (_translationQueue[prio].TryPop(out item))
  37. {
  38. return true;
  39. }
  40. }
  41. item = default(TranslatorQueueItem);
  42. return false;
  43. }
  44. public void WaitForItems()
  45. {
  46. _queueDataReceivedEvent.WaitOne();
  47. lock (_queueDataReceivedEvent)
  48. {
  49. if (!_signaled)
  50. {
  51. _queueDataReceivedEvent.Reset();
  52. }
  53. }
  54. }
  55. public void ForceSignal()
  56. {
  57. lock (_queueDataReceivedEvent)
  58. {
  59. _signaled = true;
  60. _queueDataReceivedEvent.Set();
  61. _queueDataReceivedEvent.Close();
  62. }
  63. }
  64. }
  65. }