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));
 }