From 1509c4d770e89d77103021b15eb0e54ac597d9f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Thu, 13 Apr 2006 15:51:00 +0000 Subject: [PATCH] Fixed Forum-6722: Added check for function expiration git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1302 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Debugger/Internal/ManagedCallback.cs | 5 +++- .../Project/Src/Threads/Function.cs | 12 ++++++---- .../Project/Src/Threads/Thread.cs | 23 +++++++++++++++++++ 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Internal/ManagedCallback.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Internal/ManagedCallback.cs index b997657ba1..e08e976943 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Internal/ManagedCallback.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Internal/ManagedCallback.cs @@ -94,7 +94,10 @@ namespace Debugger Thread thread = debugger.GetThread(pThread); Stepper stepper = thread.GetStepper(pStepper); - + + // There is a race condition: The tracking step out can be triggered after stepping step over + thread.CheckExpirationOfFunctions(); + thread.Steppers.Remove(stepper); stepper.OnStepComplete(); if (stepper.PauseWhenComplete) { diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs index 7560d9be71..59da4b3a09 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs @@ -27,7 +27,7 @@ namespace Debugger Stepper stepOutStepper; - bool steppedOut; + bool steppedOut = false; Thread thread; uint chainIndex; uint frameIndex; @@ -84,10 +84,13 @@ namespace Debugger /// public event EventHandler Expired; - protected virtual void OnExpired(EventArgs e) + internal protected virtual void OnExpired(EventArgs e) { - if (Expired != null) { - Expired(this, e); + if (!steppedOut) { + steppedOut = true; + if (Expired != null) { + Expired(this, e); + } } } @@ -122,7 +125,6 @@ namespace Debugger stepOutStepper.CorStepper.StepOut(); stepOutStepper.PauseWhenComplete = false; stepOutStepper.StepComplete += delegate { - steppedOut = true; OnExpired(EventArgs.Empty); }; } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Thread.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Thread.cs index 182055ff77..460a89cef1 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Thread.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Thread.cs @@ -249,6 +249,29 @@ namespace Debugger return corFrameEnum.Next(); } + internal void CheckExpirationOfFunctions() + { + ICorDebugChainEnum corChainEnum = corThread.EnumerateChains(); + uint maxChainIndex = corChainEnum.Count - 1; + + ICorDebugFrameEnum corFrameEnum = corChainEnum.Next().EnumerateFrames(); + uint maxFrameIndex = corFrameEnum.Count - 1; + + List expiredFunctions = new List(); + + foreach(KeyValuePair chain in chainCache) { + if (chain.Key < maxChainIndex) continue; + foreach(KeyValuePair func in chain.Value.Frames) { + if (chain.Key == maxChainIndex && func.Key <= maxFrameIndex) continue; + expiredFunctions.Add(func.Value); + } + } + + foreach(Function f in expiredFunctions) { + f.OnExpired(EventArgs.Empty); + } + } + public Function SelectedFunction { get { return selectedFunction;