HleCoreManager.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. using System.Collections.Concurrent;
  2. using System.Threading;
  3. namespace Ryujinx.HLE.HOS.Kernel.Threading
  4. {
  5. class HleCoreManager
  6. {
  7. private class PausableThread
  8. {
  9. public ManualResetEvent Event { get; private set; }
  10. public bool IsExiting { get; set; }
  11. public PausableThread()
  12. {
  13. Event = new ManualResetEvent(false);
  14. }
  15. }
  16. private ConcurrentDictionary<Thread, PausableThread> _threads;
  17. public HleCoreManager()
  18. {
  19. _threads = new ConcurrentDictionary<Thread, PausableThread>();
  20. }
  21. public void Set(Thread thread)
  22. {
  23. GetThread(thread).Event.Set();
  24. }
  25. public void Reset(Thread thread)
  26. {
  27. GetThread(thread).Event.Reset();
  28. }
  29. public void Wait(Thread thread)
  30. {
  31. PausableThread pausableThread = GetThread(thread);
  32. if (!pausableThread.IsExiting)
  33. {
  34. pausableThread.Event.WaitOne();
  35. }
  36. }
  37. public void Exit(Thread thread)
  38. {
  39. GetThread(thread).IsExiting = true;
  40. }
  41. private PausableThread GetThread(Thread thread)
  42. {
  43. return _threads.GetOrAdd(thread, (key) => new PausableThread());
  44. }
  45. public void RemoveThread(Thread thread)
  46. {
  47. if (_threads.TryRemove(thread, out PausableThread pausableThread))
  48. {
  49. pausableThread.Event.Set();
  50. pausableThread.Event.Dispose();
  51. }
  52. }
  53. }
  54. }