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:
authorMike Krüger <mkrueger@xamarin.com>2017-05-02 10:10:06 +0300
committerMike Krüger <mkrueger@xamarin.com>2017-05-02 10:10:06 +0300
commit1608c6e891909da39eb2047fb91a4076a9aef77b (patch)
treed45fc24fd7c2d383a8b2b80f2b4d93257daadd5a /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem
parent42d08303d7cd61ccd97832e426ea6c596f802106 (diff)
Fixed 'Bug 55705 - Quick Fix doesn't do anything'
Was caused by a projection parsing error race. The lock should be enough to fix it but now we've immutable data structures which add more thread safety.
Diffstat (limited to 'main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem')
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs19
1 files changed, 11 insertions, 8 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs
index 641aad50fb..ea8ec5dcef 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs
@@ -230,7 +230,7 @@ namespace MonoDevelop.Ide.TypeSystem
return Task.Run (async delegate {
var projects = new ConcurrentBag<ProjectInfo> ();
var mdProjects = solution.GetAllProjects ();
- projectionList.Clear ();
+ projectionList = projectionList.Clear ();
projectIdMap.Clear ();
projectDataMap.Clear ();
solutionData = new SolutionData ();
@@ -497,13 +497,15 @@ namespace MonoDevelop.Ide.TypeSystem
throw new ArgumentNullException (nameof (projectFile));
if (projections == null)
throw new ArgumentNullException (nameof (projections));
- foreach (var entry in projectionList) {
- if (entry?.File?.FilePath == projectFile.FilePath) {
- projectionList.Remove (entry);
- break;
+ lock (projectionListUpdateLock) {
+ foreach (var entry in projectionList) {
+ if (entry?.File?.FilePath == projectFile.FilePath) {
+ projectionList = projectionList.Remove (entry);
+ break;
+ }
}
+ projectionList = projectionList.Add (new ProjectionEntry { File = projectFile, Projections = projections });
}
- projectionList.Add (new ProjectionEntry { File = projectFile, Projections = projections});
}
@@ -527,7 +529,8 @@ namespace MonoDevelop.Ide.TypeSystem
false
);
}
- List<ProjectionEntry> projectionList = new List<ProjectionEntry>();
+ object projectionListUpdateLock = new object ();
+ ImmutableList<ProjectionEntry> projectionList = ImmutableList<ProjectionEntry>.Empty;
internal IReadOnlyList<ProjectionEntry> ProjectionList {
get {
@@ -616,7 +619,7 @@ namespace MonoDevelop.Ide.TypeSystem
false
);
}
- projectionList.Add (entry);
+ projectionList = projectionList.Add (entry);
}
internal static readonly string [] DefaultAssemblies = {