private void SvcWaitProcessWideKeyAtomic(AThreadState ThreadState) { long MutexAddress = (long)ThreadState.X0; long CondVarAddress = (long)ThreadState.X1; int ThreadHandle = (int)ThreadState.X2; long Timeout = (long)ThreadState.X3; KThread Thread = Process.HandleTable.GetData <KThread>(ThreadHandle); Mutex M = new Mutex(Process, MutexAddress, ThreadHandle); M = Ns.Os.Mutexes.GetOrAdd(MutexAddress, M); M.GiveUpLock(ThreadHandle); CondVar Cv = new CondVar(Process, CondVarAddress, Timeout); Cv = Ns.Os.CondVars.GetOrAdd(CondVarAddress, Cv); if (!Cv.WaitForSignal(Thread)) { ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.Timeout); return; } M.WaitForLock(Thread, ThreadHandle); ThreadState.X0 = 0; }
private void SvcWaitProcessWideKeyAtomic(AThreadState ThreadState) { long MutexAddress = (long)ThreadState.X0; long CondVarAddress = (long)ThreadState.X1; int ThreadHandle = (int)ThreadState.X2; long Timeout = (long)ThreadState.X3; HThread Thread = Ns.Os.Handles.GetData <HThread>(ThreadHandle); Mutex M = new Mutex(Process, MutexAddress, ThreadHandle); M = Ns.Os.Mutexes.GetOrAdd(MutexAddress, M); M.GiveUpLock(ThreadHandle); CondVar Cv = new CondVar(Process, CondVarAddress, Timeout); Cv = Ns.Os.CondVars.GetOrAdd(CondVarAddress, Cv); Cv.WaitForSignal(Thread); M.WaitForLock(Thread, ThreadHandle); ThreadState.X0 = (int)SvcResult.Success; }
private void SvcWaitProcessWideKeyAtomic(ARegisters Registers) { long MutexAddress = (long)Registers.X0; long CondVarAddress = (long)Registers.X1; int ThreadHandle = (int)Registers.X2; long Timeout = (long)Registers.X3; HThread Thread = Ns.Os.Handles.GetData <HThread>(ThreadHandle); if (Ns.Os.Mutexes.TryGetValue(MutexAddress, out Mutex M)) { M.GiveUpLock(ThreadHandle); } CondVar Cv = new CondVar(Process, CondVarAddress, Timeout); Cv = Ns.Os.CondVars.GetOrAdd(CondVarAddress, Cv); Cv.WaitForSignal(Thread); M = new Mutex(Process, MutexAddress, ThreadHandle); M = Ns.Os.Mutexes.GetOrAdd(MutexAddress, M); M.WaitForLock(Thread, ThreadHandle); Registers.X0 = (int)SvcResult.Success; }
private static void SvcWaitProcessWideKeyAtomic(Switch Ns, ARegisters Registers, AMemory Memory) { long MutexAddress = (long)Registers.X0; long CondVarAddress = (long)Registers.X1; int ThreadHandle = (int)Registers.X2; long Timeout = (long)Registers.X3; AThread Thread = Ns.Os.Handles.GetData <HThread>(ThreadHandle).Thread; if (Ns.Os.Mutexes.TryGetValue(MutexAddress, out Mutex M)) { M.GiveUpLock(ThreadHandle); } CondVar Signal = new CondVar(Memory, CondVarAddress, Timeout); Signal = Ns.Os.CondVars.GetOrAdd(CondVarAddress, Signal); Signal.WaitForSignal(ThreadHandle); M = new Mutex(Memory, MutexAddress); M = Ns.Os.Mutexes.GetOrAdd(MutexAddress, M); //FIXME //M.WaitForLock(Thread, ThreadHandle); Memory.WriteInt32(MutexAddress, 0); Registers.X0 = (int)SvcResult.Success; }