Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Ward <matt.ward@microsoft.com>2020-01-22 20:02:53 +0300
committerMatt Ward <matt.ward@microsoft.com>2020-01-22 20:04:45 +0300
commit322e35b5312260d2cf8cd50e1d01531660a07e5a (patch)
tree7c04c7e166e546840b377a83f93cca255752d085
parent18f6524b63123ade916831bdd9f2b7b3d7016957 (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.cs28
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);
}