EvalResult SyncWait() { Debug.Assert(startTime != null); var now = DateTime.UtcNow; if (now >= endTime) { now = endTime; } var timeLeft = endTime - now; if (!useTotalTimeout) { timeLeft = TimeSpan.FromMilliseconds(TIMEOUT_MS); } var infos = new ThreadInfos(thread, SuspendOtherThreads); object dispResult; debugger.DebugCallbackEvent += Debugger_DebugCallbackEvent; bool timedOut; try { infos.EnableThread(); debugger.EvalStarted(); dispResult = debugMessageDispatcher.DispatchQueue(timeLeft, out timedOut); if (timedOut) { bool timedOutTmp; int hr = eval.Abort(); if (hr >= 0) { debugMessageDispatcher.DispatchQueue(TimeSpan.FromMilliseconds(ABORT_TIMEOUT_MS), out timedOutTmp); if (timedOutTmp) { hr = eval.RudeAbort(); if (hr >= 0) { debugMessageDispatcher.DispatchQueue(TimeSpan.FromMilliseconds(RUDE_ABORT_TIMEOUT_MS), out timedOutTmp); } } } hr = debugger.TryBreakProcesses(); Debug.WriteLineIf(hr != 0, string.Format("Eval timed out and TryBreakProcesses() failed: hr=0x{0:X8}", hr)); EvalTimedOut = true; throw new TimeoutException(); } } finally { debugger.DebugCallbackEvent -= Debugger_DebugCallbackEvent; infos.RestoreThreads(); debugger.EvalStopped(); } Debug.Assert(dispResult is bool); bool wasException = (bool)dispResult; return(new EvalResult(wasException, eval.Result)); }
EvalResult SyncWait() { Debug.Assert(startTime != null); var now = DateTime.UtcNow; if (now >= endTime) now = endTime; var timeLeft = endTime - now; var infos = new ThreadInfos(thread, SuspendOtherThreads); object dispResult; debugger.DebugCallbackEvent += Debugger_DebugCallbackEvent; bool timedOut; try { infos.EnableThread(); debugger.EvalStarted(); dispResult = debugMessageDispatcher.DispatchQueue(timeLeft, out timedOut); if (timedOut) { bool timedOutTmp; int hr = eval.Abort(); if (hr >= 0) { debugMessageDispatcher.DispatchQueue(TimeSpan.FromMilliseconds(ABORT_TIMEOUT_MS), out timedOutTmp); if (timedOutTmp) { hr = eval.RudeAbort(); if (hr >= 0) debugMessageDispatcher.DispatchQueue(TimeSpan.FromMilliseconds(RUDE_ABORT_TIMEOUT_MS), out timedOutTmp); } } hr = debugger.TryBreakProcesses(); Debug.WriteLineIf(hr != 0, string.Format("Eval timed out and TryBreakProcesses() failed: hr=0x{0:X8}", hr)); evalTimedOut = true; throw new TimeoutException(); } } finally { debugger.DebugCallbackEvent -= Debugger_DebugCallbackEvent; infos.RestoreThreads(); debugger.EvalStopped(); } Debug.Assert(dispResult is bool); bool wasException = (bool)dispResult; return new EvalResult(wasException, eval.Result); }