private (long, KThread) MutexUnlock(KThread currentThread, long mutexAddress) { KThread newOwnerThread = currentThread.RelinquishMutex(mutexAddress, out int count); int mutexValue = 0; if (newOwnerThread != null) { mutexValue = newOwnerThread.ThreadHandleForUserMutex; if (count >= 2) { mutexValue |= HasListenersMask; } newOwnerThread.SignaledObj = null; newOwnerThread.ObjSyncResult = 0; newOwnerThread.ReleaseAndResume(); } long result = 0; if (!KernelTransfer.KernelToUserInt32(_system, mutexAddress, mutexValue)) { result = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); } return(result, newOwnerThread); }
private (long, KThread) MutexUnlock(KThread CurrentThread, long MutexAddress) { KThread NewOwnerThread = CurrentThread.RelinquishMutex(MutexAddress, out int Count); int MutexValue = 0; if (NewOwnerThread != null) { MutexValue = NewOwnerThread.ThreadHandleForUserMutex; if (Count >= 2) { MutexValue |= HasListenersMask; } NewOwnerThread.SignaledObj = null; NewOwnerThread.ObjSyncResult = 0; NewOwnerThread.ReleaseAndResume(); } long Result = 0; if (!KernelTransfer.KernelToUserInt32(System, MutexAddress, MutexValue)) { Result = MakeError(ErrorModule.Kernel, KernelErr.NoAccessPerm); } return(Result, NewOwnerThread); }
private void MutexUnlock(AMemory Memory, KThread CurrentThread, long MutexAddress) { KThread NewOwnerThread = CurrentThread.RelinquishMutex(MutexAddress, out int Count); int MutexValue = 0; if (NewOwnerThread != null) { MutexValue = NewOwnerThread.ThreadHandleForUserMutex; if (Count >= 2) { MutexValue |= HasListenersMask; } NewOwnerThread.SignaledObj = null; NewOwnerThread.ObjSyncResult = 0; NewOwnerThread.ReleaseAndResume(); } Memory.WriteInt32ToSharedAddr(MutexAddress, MutexValue); }