void IDeadlockMonitorAdapter.ExitWriteLock(ReaderWriterLockSlim obj) { // Помечаем данный поток как не имеющий блокировку объекта obj с уровнем WriteLock DeadlockDetectionEngine.ReleaseOwner(obj, LockAccessLevel.Write); obj.ExitWriteLock(); }
private static bool TryEnterLock <T>( T lockObject, LockAccessLevel level, Func <T, bool> wait) { DeadlockDetectionEngine.RegisterWaiting(lockObject, level); if (!wait(lockObject)) { DeadlockDetectionEngine.RemoveWaiting(lockObject, level); return(false); } // Помечаем данный поток как имеющий блокировку объекта obj с уровнем level DeadlockDetectionEngine.RegisterOwner(lockObject, level); return(true); }
private static void EnterLock <T>( T lockObject, LockAccessLevel level, Func <T, bool> optimisticWait, Action <T> wait) { // Сначала дожидаемся в пределах оптимистичного таймаута DeadlockDetectionEngine.RegisterWaiting(lockObject, level); if (!optimisticWait(lockObject)) { // Если блокировка не былаа захвачена в течении оптимистичного таймаута, // то проверяем, нет ли дедлока DeadlockDetectionEngine.VerifyDeadlock(lockObject, level); // Дожидаемся захвата блокировки wait(lockObject); } // Помечаем данный поток как имеющий блокировку объекта obj с уровнем level DeadlockDetectionEngine.RegisterOwner(lockObject, level); }
string IDeadlockMonitorAdapter.GetDiagnostics(bool enableStackTrace) => DeadlockDetectionEngine.GetDiagnostics(enableStackTrace);