TranslatorQueue.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using ChocolArm64.State;
  2. using System.Collections.Concurrent;
  3. using System.Threading;
  4. namespace ChocolArm64.Translation
  5. {
  6. class TranslatorQueue
  7. {
  8. private ConcurrentStack<TranslatorQueueItem>[] _translationQueue;
  9. private ManualResetEvent _queueDataReceivedEvent;
  10. private bool _signaled;
  11. public TranslatorQueue()
  12. {
  13. _translationQueue = new ConcurrentStack<TranslatorQueueItem>[(int)TranslationTier.Count];
  14. for (int prio = 0; prio < _translationQueue.Length; prio++)
  15. {
  16. _translationQueue[prio] = new ConcurrentStack<TranslatorQueueItem>();
  17. }
  18. _queueDataReceivedEvent = new ManualResetEvent(false);
  19. }
  20. public void Enqueue(long position, ExecutionMode mode, TranslationTier tier, bool isComplete)
  21. {
  22. TranslatorQueueItem item = new TranslatorQueueItem(position, mode, tier, isComplete);
  23. ConcurrentStack<TranslatorQueueItem> queue = _translationQueue[(int)tier];
  24. queue.Push(item);
  25. _queueDataReceivedEvent.Set();
  26. }
  27. public bool TryDequeue(out TranslatorQueueItem item)
  28. {
  29. for (int prio = 0; prio < _translationQueue.Length; prio++)
  30. {
  31. if (_translationQueue[prio].TryPop(out item))
  32. {
  33. return true;
  34. }
  35. }
  36. item = default(TranslatorQueueItem);
  37. return false;
  38. }
  39. public void WaitForItems()
  40. {
  41. _queueDataReceivedEvent.WaitOne();
  42. lock (_queueDataReceivedEvent)
  43. {
  44. if (!_signaled)
  45. {
  46. _queueDataReceivedEvent.Reset();
  47. }
  48. }
  49. }
  50. public void ForceSignal()
  51. {
  52. lock (_queueDataReceivedEvent)
  53. {
  54. _signaled = true;
  55. _queueDataReceivedEvent.Set();
  56. _queueDataReceivedEvent.Close();
  57. }
  58. }
  59. }
  60. }