Ejemplo n.º 1
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;

            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;
        }
Ejemplo n.º 2
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;
        }
Ejemplo n.º 3
0
        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;
        }
Ejemplo n.º 4
0
        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;
        }