From 809a2bc9341c3d54579fd11a50130a7a217cc3e5 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 5 Jul 2019 15:34:09 -0400 Subject: [Debugger] Make sure to lock around BreakpointStore when using it Might fix https://devdiv.visualstudio.com/DevDiv/_workitems/edit/935168/ --- .../BreakpointManager.cs | 14 ++++++++++--- .../MonoDevelop.Debugger/PinnedWatchStore.cs | 8 ++++---- .../QuickTaskOverviewMode.cs | 24 ++++++++++++++-------- .../MonoDevelop.SourceEditor/SourceEditorView.cs | 2 +- 4 files changed, 31 insertions(+), 17 deletions(-) (limited to 'main') diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.VSTextView/BreakpointManager.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.VSTextView/BreakpointManager.cs index 93058fe629..9e7aff8e03 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.VSTextView/BreakpointManager.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.VSTextView/BreakpointManager.cs @@ -63,13 +63,21 @@ namespace MonoDevelop.Debugger private async void OnBreakpointsChanged (object sender, EventArgs eventArgs) { var newBreakpoints = new Dictionary (); + var breakpointStore = DebuggingService.Breakpoints; var snapshot = textBuffer.CurrentSnapshot; + var bps = new List (); var needsUpdate = false; - foreach (var breakpoint in DebuggingService.Breakpoints.GetBreakpointsAtFile (textDocument.FilePath)) { - if (breakpoint.Line > snapshot.LineCount) - continue; + lock (breakpointStore) { + foreach (var breakpoint in breakpointStore.GetBreakpointsAtFile (textDocument.FilePath)) { + if (breakpoint.Line > snapshot.LineCount) + continue; + + bps.Add (breakpoint); + } + } + foreach (var breakpoint in bps) { if (eventArgs is BreakpointEventArgs breakpointEventArgs && breakpointEventArgs.Breakpoint == breakpoint) needsUpdate = true; diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/PinnedWatchStore.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/PinnedWatchStore.cs index ffdb0eaa8f..2e5fe0cca0 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/PinnedWatchStore.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/PinnedWatchStore.cs @@ -90,11 +90,11 @@ namespace MonoDevelop.Debugger internal void BindAll (BreakpointStore bps) { lock (watches) { - foreach (PinnedWatch w in watches) { - foreach (Breakpoint bp in bps.GetBreakpoints ()) { + foreach (var watch in watches) { + foreach (var bp in bps.GetBreakpoints ()) { if ((bp.HitAction & HitAction.PrintExpression) != HitAction.None && - bp.TraceExpression == "{" + w.Expression + "}" && bp.FileName == w.File && bp.Line == w.Line) - Bind (w, bp); + bp.TraceExpression == "{" + watch.Expression + "}" && bp.FileName == watch.File && bp.Line == watch.Line) + Bind (watch, bp); } } } diff --git a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.QuickTasks/QuickTaskOverviewMode.cs b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.QuickTasks/QuickTaskOverviewMode.cs index 183293bcf6..38d4003d5b 100644 --- a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.QuickTasks/QuickTaskOverviewMode.cs +++ b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor.QuickTasks/QuickTaskOverviewMode.cs @@ -723,16 +723,22 @@ namespace MonoDevelop.SourceEditor.QuickTasks void DrawBreakpoints (Cairo.Context cr) { - var breakPoints = parentStrip.SourceEditorView.Breakpoints.GetBreakpointsAtFile (TextEditor.FileName); - if (breakPoints == null) - return; - foreach (var point in breakPoints) { - int y = (int)GetYPosition (point.Line); + var breakpointStore = parentStrip.SourceEditorView.Breakpoints; - cr.SetSourceColor (SyntaxHighlightingService.GetColor (TextEditor.EditorTheme, EditorThemeColors.BreakpointMarker)); - int r = 4; - cr.Rectangle (0, y - r / 2, r, r); - cr.Fill (); + lock (breakpointStore) { + var breakPoints = breakpointStore.GetBreakpointsAtFile (TextEditor.FileName); + + if (breakPoints == null) + return; + + foreach (var point in breakPoints) { + int y = (int)GetYPosition (point.Line); + + cr.SetSourceColor (SyntaxHighlightingService.GetColor (TextEditor.EditorTheme, EditorThemeColors.BreakpointMarker)); + int r = 4; + cr.Rectangle (0, y - r / 2, r, r); + cr.Fill (); + } } } diff --git a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/SourceEditorView.cs b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/SourceEditorView.cs index 1b047408f9..c9407e4dbe 100644 --- a/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/SourceEditorView.cs +++ b/main/src/addins/MonoDevelop.SourceEditor2/MonoDevelop.SourceEditor/SourceEditorView.cs @@ -1384,7 +1384,7 @@ namespace MonoDevelop.SourceEditor breakpointSegments.Clear (); lock (breakpoints) { - foreach (Breakpoint bp in breakpoints.GetBreakpointsAtFile (fp.FullPath)) { + foreach (var bp in breakpoints.GetBreakpointsAtFile (fp.FullPath)) { lineNumbers.Add (bp.Line); AddBreakpoint (bp); } -- cgit v1.2.3