HleCoreManager.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. using System.Collections.Concurrent;
  2. using System.Threading;
  3. namespace Ryujinx.HLE.HOS.Kernel
  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. }