diff options
author | Mike Krüger <mkrueger@xamarin.com> | 2017-05-02 10:10:06 +0300 |
---|---|---|
committer | Mike Krüger <mkrueger@xamarin.com> | 2017-05-02 10:10:06 +0300 |
commit | 1608c6e891909da39eb2047fb91a4076a9aef77b (patch) | |
tree | d45fc24fd7c2d383a8b2b80f2b4d93257daadd5a | |
parent | 42d08303d7cd61ccd97832e426ea6c596f802106 (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.
-rw-r--r-- | main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs | 19 |
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 = {
|