public KThread RelinquishMutex(long MutexAddress, out int Count) { Count = 0; if (MutexWaiters.First == null) { return(null); } KThread NewMutexOwner = null; LinkedListNode <KThread> CurrentNode = MutexWaiters.First; do { //Skip all threads that are not waiting for this mutex. while (CurrentNode != null && CurrentNode.Value.MutexAddress != MutexAddress) { CurrentNode = CurrentNode.Next; } if (CurrentNode == null) { break; } LinkedListNode <KThread> NextNode = CurrentNode.Next; MutexWaiters.Remove(CurrentNode); CurrentNode.Value.MutexOwner = NewMutexOwner; if (NewMutexOwner != null) { //New owner was already selected, re-insert on new owner list. NewMutexOwner.AddToMutexWaitersList(CurrentNode.Value); } else { //New owner not selected yet, use current thread. NewMutexOwner = CurrentNode.Value; } Count++; CurrentNode = NextNode; }while (CurrentNode != null); if (NewMutexOwner != null) { UpdatePriorityInheritance(); NewMutexOwner.UpdatePriorityInheritance(); } return(NewMutexOwner); }
public KThread RelinquishMutex(long mutexAddress, out int count) { count = 0; if (_mutexWaiters.First == null) { return(null); } KThread newMutexOwner = null; LinkedListNode <KThread> currentNode = _mutexWaiters.First; do { //Skip all threads that are not waiting for this mutex. while (currentNode != null && currentNode.Value.MutexAddress != mutexAddress) { currentNode = currentNode.Next; } if (currentNode == null) { break; } LinkedListNode <KThread> nextNode = currentNode.Next; _mutexWaiters.Remove(currentNode); currentNode.Value.MutexOwner = newMutexOwner; if (newMutexOwner != null) { //New owner was already selected, re-insert on new owner list. newMutexOwner.AddToMutexWaitersList(currentNode.Value); } else { //New owner not selected yet, use current thread. newMutexOwner = currentNode.Value; } count++; currentNode = nextNode; }while (currentNode != null); if (newMutexOwner != null) { UpdatePriorityInheritance(); newMutexOwner.UpdatePriorityInheritance(); } return(newMutexOwner); }