diff options
author | Matt Ward <matt.ward@microsoft.com> | 2020-01-22 20:02:53 +0300 |
---|---|---|
committer | Matt Ward <matt.ward@microsoft.com> | 2020-01-22 20:04:45 +0300 |
commit | 322e35b5312260d2cf8cd50e1d01531660a07e5a (patch) | |
tree | 7c04c7e166e546840b377a83f93cca255752d085 | |
parent | 18f6524b63123ade916831bdd9f2b7b3d7016957 (diff) |
[Debugger] Make DebuggingService dictionaries thread safe.
The sessions dictionary and the nextStatementLocations dictionary
were accessed from multiple threads. Changed these dictionaries to
be ConcurrentDictionary so their use is thread safe.
-rw-r--r-- | main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggingService.cs | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggingService.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggingService.cs index 60d5fa309f..25c19d22ad 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggingService.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggingService.cs @@ -67,8 +67,8 @@ namespace MonoDevelop.Debugger static readonly BreakpointStore breakpoints = new BreakpointStore (); static readonly DebugExecutionHandlerFactory executionHandlerFactory; - static Dictionary<long, SourceLocation> nextStatementLocations = new Dictionary<long, SourceLocation> (); - static Dictionary<DebuggerSession, SessionManager> sessions = new Dictionary<DebuggerSession, SessionManager> (); + static ConcurrentDictionary<long, SourceLocation> nextStatementLocations = new ConcurrentDictionary<long, SourceLocation> (); + static ConcurrentDictionary<DebuggerSession, SessionManager> sessions = new ConcurrentDictionary<DebuggerSession, SessionManager> (); static Backtrace currentBacktrace; static SessionManager currentSession; static int currentFrame; @@ -151,7 +151,7 @@ namespace MonoDevelop.Debugger public static DebuggerSession GetSession (IRunTarget runTarget) { - foreach (KeyValuePair<DebuggerSession, SessionManager> item in sessions.ToArray ()) { + foreach (KeyValuePair<DebuggerSession, SessionManager> item in sessions) { if (item.Value.RunTarget == runTarget) { return item.Key; } @@ -161,10 +161,8 @@ namespace MonoDevelop.Debugger public static IRunTarget GetRunTarget (DebuggerSession session) { - foreach (KeyValuePair<DebuggerSession, SessionManager> item in sessions.ToArray ()) { - if (item.Key == session) { - return item.Value.RunTarget; - } + if (sessions.TryGetValue (session, out SessionManager sessionManager)) { + return sessionManager.RunTarget; } return null; } @@ -177,8 +175,8 @@ namespace MonoDevelop.Debugger public static BreakEventStatus GetBreakpointStatus (Breakpoint bp) { var result = BreakEventStatus.Disconnected; - foreach (var sesion in sessions.Keys.ToArray ()) { - var status = bp.GetStatus (sesion); + foreach (var session in sessions.Keys) { + var status = bp.GetStatus (session); if (status == BreakEventStatus.Bound) return BreakEventStatus.Bound; else @@ -418,7 +416,7 @@ namespace MonoDevelop.Debugger static void SetupSession (SessionManager sessionManager) { - sessions.Add (sessionManager.Session, sessionManager); + sessions [sessionManager.Session] = sessionManager; isBusy = false; var session = sessionManager.Session; session.Breakpoints = breakpoints; @@ -463,7 +461,7 @@ namespace MonoDevelop.Debugger currentBacktrace = null; } busyStatusIcon = null; - sessions.Remove (sessionManager.Session); + sessions.TryRemove (sessionManager.Session, out _); pinnedWatches.InvalidateAll (); } @@ -549,7 +547,7 @@ namespace MonoDevelop.Debugger public static void Pause () { - foreach (var session in sessions.Keys.ToArray ()) { + foreach (var session in sessions.Keys) { if (session.IsRunning) session.Stop (); } @@ -577,7 +575,7 @@ namespace MonoDevelop.Debugger if (HandleStopQueue ()) return; - foreach (var session in sessions.Keys.ToArray ()) { + foreach (var session in sessions.Keys) { if (!session.IsRunning) session.Continue (); } @@ -695,7 +693,7 @@ namespace MonoDevelop.Debugger PropertyService.Set ("Monodevelop.StackTrace.ShowLineNumber", options.EvaluationOptions.StackFrameFormat.Line); PropertyService.Set ("Monodevelop.StackTrace.ShowExternalCode", options.EvaluationOptions.StackFrameFormat.ExternalCode); - foreach (var session in sessions.Keys.ToArray ()) { + foreach (var session in sessions.Keys) { session.Options.EvaluationOptions = GetUserOptions ().EvaluationOptions; } if (EvaluationOptionsChanged != null) @@ -1133,7 +1131,7 @@ namespace MonoDevelop.Debugger if (!IsDebugging) return; - foreach (var pair in sessions.ToArray ()) { + foreach (var pair in sessions) { pair.Key.Exit (); Cleanup (pair.Value); } |