SvcThreadSync.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using ChocolArm64;
  2. using ChocolArm64.Memory;
  3. using ChocolArm64.State;
  4. using Ryujinx.OsHle.Handles;
  5. namespace Ryujinx.OsHle.Svc
  6. {
  7. partial class SvcHandler
  8. {
  9. private static void SvcArbitrateLock(Switch Ns, ARegisters Registers, AMemory Memory)
  10. {
  11. int OwnerThreadHandle = (int)Registers.X0;
  12. long MutexAddress = (long)Registers.X1;
  13. int RequestingThreadHandle = (int)Registers.X2;
  14. AThread RequestingThread = Ns.Os.Handles.GetData<HThread>(RequestingThreadHandle).Thread;
  15. Mutex M = new Mutex(Memory, MutexAddress);
  16. M = Ns.Os.Mutexes.GetOrAdd(MutexAddress, M);
  17. //FIXME
  18. //M.WaitForLock(RequestingThread, RequestingThreadHandle);
  19. Memory.WriteInt32(MutexAddress, 0);
  20. Registers.X0 = (int)SvcResult.Success;
  21. }
  22. private static void SvcArbitrateUnlock(Switch Ns, ARegisters Registers, AMemory Memory)
  23. {
  24. long MutexAddress = (long)Registers.X0;
  25. if (Ns.Os.Mutexes.TryGetValue(MutexAddress, out Mutex M))
  26. {
  27. M.Unlock();
  28. }
  29. Registers.X0 = (int)SvcResult.Success;
  30. }
  31. private static void SvcWaitProcessWideKeyAtomic(Switch Ns, ARegisters Registers, AMemory Memory)
  32. {
  33. long MutexAddress = (long)Registers.X0;
  34. long CondVarAddress = (long)Registers.X1;
  35. int ThreadHandle = (int)Registers.X2;
  36. long Timeout = (long)Registers.X3;
  37. AThread Thread = Ns.Os.Handles.GetData<HThread>(ThreadHandle).Thread;
  38. if (Ns.Os.Mutexes.TryGetValue(MutexAddress, out Mutex M))
  39. {
  40. M.GiveUpLock(ThreadHandle);
  41. }
  42. CondVar Signal = new CondVar(Memory, CondVarAddress, Timeout);
  43. Signal = Ns.Os.CondVars.GetOrAdd(CondVarAddress, Signal);
  44. Signal.WaitForSignal(ThreadHandle);
  45. M = new Mutex(Memory, MutexAddress);
  46. M = Ns.Os.Mutexes.GetOrAdd(MutexAddress, M);
  47. //FIXME
  48. //M.WaitForLock(Thread, ThreadHandle);
  49. Memory.WriteInt32(MutexAddress, 0);
  50. Registers.X0 = (int)SvcResult.Success;
  51. }
  52. private static void SvcSignalProcessWideKey(Switch Ns, ARegisters Registers, AMemory Memory)
  53. {
  54. long CondVarAddress = (long)Registers.X0;
  55. int Count = (int)Registers.X1;
  56. if (Ns.Os.CondVars.TryGetValue(CondVarAddress, out CondVar Cv))
  57. {
  58. Cv.SetSignal(Count);
  59. }
  60. Registers.X0 = (int)SvcResult.Success;
  61. }
  62. }
  63. }