public void RemoveOwnedLock(LockObjectNode node) { if (node.RemoveOwner(this)) { ownedLocks.Remove(node); } }
public void RegisterOwnedLock(LockObjectNode node) { if (node.SetOwner(this)) { ownedLocks.Add(node); } }
private static LockObjectNode GetLockObjectNode(object lockObject) { lock (_WaitGraphLock) { LockObjectNode node; if (!_LockObjectNodes.TryGetValue(lockObject, out node)) { node = new LockObjectNode(lockObject); _LockObjectNodes.Add(lockObject, node); } return(node); } }
private static DeadlockException CreateDeadlockException( LockObjectNode lockObject, ThreadNode currentThread, WaitGraphCycle cycle, LockAccessLevel level) { var errorMessage = new StringBuilder(); errorMessage.AppendFormat( "Deadlock detected in thread {0} while trying to acquire {1} access to object \"{2}\".\r\n", currentThread.Name, level, lockObject.Name); errorMessage.Append("Wait chain: \r\n"); foreach (var obj in cycle.LockObjects) { errorMessage.AppendFormat( " * Thread {0} waits for {1} owned by thread {2}\r\n", cycle.Threads.Where(_ => _.WaitsForLockObject == obj).Select(_ => _.Name).FirstOrDefault(), obj.Name, obj.Owner.Name); } foreach (var thread in cycle.Threads) { AppendThreadState(thread, errorMessage, true); } var message = errorMessage.ToString(); DeadlockMonitor.Callback?.Invoke(message); return(new DeadlockException(message)); }
private bool Equals(LockObjectNode other) { return(LockObject.Equals(other.LockObject)); }
public bool OwnsLock(LockObjectNode node) { return(ownedLocks.Contains(node)); }