예제 #1
0
        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));
        }
예제 #2
0
파일: DnEval.cs 프로젝트: lovebanyi/dnSpy
        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);
        }