From 0a4d05cc97a1812eb61a448bf1401133fa6b64f5 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 17 Mar 2012 01:00:38 +0100 Subject: [PATCH] Fixed race condition in project.GetOrCreateBehavior(). Avoid loading behaviors into UnknownProject/MissingProject. --- .../Boo/BooBinding/Project/Src/BooProject.cs | 8 ++------ .../CSharpBinding/Project/Src/Project/CSharpProject.cs | 8 ++------ .../CppBinding/CppBinding/Project/CppProject.cs | 9 +++------ .../BackendBindings/FSharpBinding/FSharpProject.cs | 8 ++------ .../Python/PythonBinding/Project/Src/PythonProject.cs | 8 ++------ .../Ruby/RubyBinding/Project/Src/RubyProject.cs | 8 ++------ .../VBNetBinding/Project/Src/Project/VBNetProject.cs | 8 ++------ .../WixBinding/Project/Src/Project/WixProject.cs | 8 ++------ src/Main/Base/Project/Src/Project/AbstractProject.cs | 8 +++++--- .../ProjectBehaviorSupportedConditionEvaluator.cs | 3 +++ src/Main/Base/Project/Src/Project/CompilableProject.cs | 5 +++++ src/Main/Base/Project/Src/Project/MissingProject.cs | 10 ++++++++++ src/Main/Base/Project/Src/Project/UnknownProject.cs | 10 ++++++++++ .../Base/Test/WebReferences/WebReferenceTestHelper.cs | 2 +- 14 files changed, 51 insertions(+), 52 deletions(-) diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooProject.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooProject.cs index f32e23ace2..434eb11541 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooProject.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooProject.cs @@ -131,13 +131,9 @@ namespace Grunwald.BooBinding } } - protected override ProjectBehavior GetOrCreateBehavior() + protected override ProjectBehavior CreateDefaultBehavior() { - if (projectBehavior != null) - return projectBehavior; - BooProjectBehavior behavior = new BooProjectBehavior(this, new DotNetStartBehavior(this, new DefaultProjectBehavior(this))); - projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, behavior); - return projectBehavior; + return new BooProjectBehavior(this, base.CreateDefaultBehavior()); } } diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs index 981bb50588..a22de46ed0 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs @@ -149,13 +149,9 @@ namespace CSharpBinding } */ - protected override ProjectBehavior GetOrCreateBehavior() + protected override ProjectBehavior CreateDefaultBehavior() { - if (projectBehavior != null) - return projectBehavior; - CSharpProjectBehavior behavior = new CSharpProjectBehavior(this, new DotNetStartBehavior(this, new DefaultProjectBehavior(this))); - projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, behavior); - return projectBehavior; + return new CSharpProjectBehavior(this, base.CreateDefaultBehavior()); } } diff --git a/src/AddIns/BackendBindings/CppBinding/CppBinding/Project/CppProject.cs b/src/AddIns/BackendBindings/CppBinding/CppBinding/Project/CppProject.cs index 9bc76fae6e..dcff45097b 100644 --- a/src/AddIns/BackendBindings/CppBinding/CppBinding/Project/CppProject.cs +++ b/src/AddIns/BackendBindings/CppBinding/CppBinding/Project/CppProject.cs @@ -181,13 +181,10 @@ namespace ICSharpCode.CppBinding.Project } } - protected override ProjectBehavior GetOrCreateBehavior() + protected override ProjectBehavior CreateDefaultBehavior() { - if (projectBehavior != null) - return projectBehavior; - CppProjectBehavior behavior = new CppProjectBehavior(this, new DotNetStartBehavior(this, new DefaultProjectBehavior(this))); - projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, behavior); - return projectBehavior; } + return new CppProjectBehavior(this, base.CreateDefaultBehavior()); + } } public class CppProjectBehavior : ProjectBehavior diff --git a/src/AddIns/BackendBindings/FSharpBinding/FSharpProject.cs b/src/AddIns/BackendBindings/FSharpBinding/FSharpProject.cs index 1ce02b2cdc..c07777a33e 100644 --- a/src/AddIns/BackendBindings/FSharpBinding/FSharpProject.cs +++ b/src/AddIns/BackendBindings/FSharpBinding/FSharpProject.cs @@ -44,13 +44,9 @@ namespace FSharpBinding } } - protected override ProjectBehavior GetOrCreateBehavior() + protected override ProjectBehavior CreateDefaultBehavior() { - if (projectBehavior != null) - return projectBehavior; - FSharpProjectBehavior behavior = new FSharpProjectBehavior(this, new DotNetStartBehavior(this, new DefaultProjectBehavior(this))); - projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, behavior); - return projectBehavior; + return new FSharpProjectBehavior(this, base.CreateDefaultBehavior()); } } diff --git a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonProject.cs b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonProject.cs index d13488e73c..3fe29272ca 100644 --- a/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonProject.cs +++ b/src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonProject.cs @@ -53,13 +53,9 @@ namespace ICSharpCode.PythonBinding get { return GetProperty(null, null, "MainFile") != null; } } - protected override ProjectBehavior GetOrCreateBehavior() + protected override ProjectBehavior CreateDefaultBehavior() { - if (projectBehavior != null) - return projectBehavior; - PythonProjectBehavior behavior = new PythonProjectBehavior(this, new DotNetStartBehavior(this, new DefaultProjectBehavior(this))); - projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, behavior); - return projectBehavior; + return new PythonProjectBehavior(this, base.CreateDefaultBehavior()); } } diff --git a/src/AddIns/BackendBindings/Ruby/RubyBinding/Project/Src/RubyProject.cs b/src/AddIns/BackendBindings/Ruby/RubyBinding/Project/Src/RubyProject.cs index bc9ba428f8..9f0badc9b1 100644 --- a/src/AddIns/BackendBindings/Ruby/RubyBinding/Project/Src/RubyProject.cs +++ b/src/AddIns/BackendBindings/Ruby/RubyBinding/Project/Src/RubyProject.cs @@ -49,13 +49,9 @@ namespace ICSharpCode.RubyBinding get { return GetProperty(null, null, "MainFile") != null; } } - protected override ProjectBehavior GetOrCreateBehavior() + protected override ProjectBehavior CreateDefaultBehavior() { - if (projectBehavior != null) - return projectBehavior; - RubyProjectBehavior behavior = new RubyProjectBehavior(this, new DotNetStartBehavior(this, new DefaultProjectBehavior(this))); - projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, behavior); - return projectBehavior; + return new RubyProjectBehavior(this, base.CreateDefaultBehavior()); } } diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs index d461890373..334d1ebe1f 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs @@ -185,13 +185,9 @@ namespace ICSharpCode.VBNetBinding return "On".Equals(val, StringComparison.OrdinalIgnoreCase); } - protected override ProjectBehavior GetOrCreateBehavior() + protected override ProjectBehavior CreateDefaultBehavior() { - if (projectBehavior != null) - return projectBehavior; - VBProjectBehavior behavior = new VBProjectBehavior(this, new DotNetStartBehavior(this, new DefaultProjectBehavior(this))); - projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, behavior); - return projectBehavior; + return new VBProjectBehavior(this, base.CreateDefaultBehavior()); } } diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixProject.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixProject.cs index 9488789f69..64540d3a67 100644 --- a/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixProject.cs +++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixProject.cs @@ -216,13 +216,9 @@ namespace ICSharpCode.WixBinding return new ReadOnlyCollection(items); } - protected override ProjectBehavior GetOrCreateBehavior() + protected override ProjectBehavior CreateDefaultBehavior() { - if (projectBehavior != null) - return projectBehavior; - WixStartBehavior behavior = new WixStartBehavior(this, new DotNetStartBehavior(this, new DefaultProjectBehavior(this))); - projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, behavior); - return projectBehavior; + return new WixStartBehavior(this, base.CreateDefaultBehavior()); } } diff --git a/src/Main/Base/Project/Src/Project/AbstractProject.cs b/src/Main/Base/Project/Src/Project/AbstractProject.cs index 46eea67028..f4ec75ca78 100644 --- a/src/Main/Base/Project/Src/Project/AbstractProject.cs +++ b/src/Main/Base/Project/Src/Project/AbstractProject.cs @@ -591,9 +591,11 @@ namespace ICSharpCode.SharpDevelop.Project protected virtual ProjectBehavior GetOrCreateBehavior() { - if (projectBehavior == null) - projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, CreateDefaultBehavior()); - return projectBehavior; + lock (SyncRoot) { + if (projectBehavior == null) + projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, CreateDefaultBehavior()); + return projectBehavior; + } } } } diff --git a/src/Main/Base/Project/Src/Project/Behaviors/ProjectBehaviorSupportedConditionEvaluator.cs b/src/Main/Base/Project/Src/Project/Behaviors/ProjectBehaviorSupportedConditionEvaluator.cs index 722ada79b3..04c2673f35 100644 --- a/src/Main/Base/Project/Src/Project/Behaviors/ProjectBehaviorSupportedConditionEvaluator.cs +++ b/src/Main/Base/Project/Src/Project/Behaviors/ProjectBehaviorSupportedConditionEvaluator.cs @@ -39,6 +39,9 @@ namespace ICSharpCode.SharpDevelop.Project string guid = ((MSBuildBasedProject)project).GetEvaluatedProperty("ProjectTypeGuids"); if (!string.IsNullOrEmpty(guid)) return guid; + } else if (project is UnknownProject || project is MissingProject) { + // don't return any GUID for projects that could not be loaded + return string.Empty; } return project.TypeGuid; diff --git a/src/Main/Base/Project/Src/Project/CompilableProject.cs b/src/Main/Base/Project/Src/Project/CompilableProject.cs index 958c5afe20..a1ee2cf4ff 100644 --- a/src/Main/Base/Project/Src/Project/CompilableProject.cs +++ b/src/Main/Base/Project/Src/Project/CompilableProject.cs @@ -263,6 +263,11 @@ namespace ICSharpCode.SharpDevelop.Project } } + protected override ProjectBehavior CreateDefaultBehavior() + { + return new DotNetStartBehavior(this, base.CreateDefaultBehavior()); + } + #region IUpgradableProject [Browsable(false)] public virtual bool UpgradeDesired { diff --git a/src/Main/Base/Project/Src/Project/MissingProject.cs b/src/Main/Base/Project/Src/Project/MissingProject.cs index d70623ae7d..721d8c7d51 100644 --- a/src/Main/Base/Project/Src/Project/MissingProject.cs +++ b/src/Main/Base/Project/Src/Project/MissingProject.cs @@ -20,5 +20,15 @@ namespace ICSharpCode.SharpDevelop.Project return true; } } + + protected override ProjectBehavior GetOrCreateBehavior() + { + // don't add behaviors from AddIn-Tree to MissingProject + lock (SyncRoot) { + if (projectBehavior == null) + projectBehavior = new DefaultProjectBehavior(this); + return projectBehavior; + } + } } } diff --git a/src/Main/Base/Project/Src/Project/UnknownProject.cs b/src/Main/Base/Project/Src/Project/UnknownProject.cs index 55a69de168..efdc1c23e4 100644 --- a/src/Main/Base/Project/Src/Project/UnknownProject.cs +++ b/src/Main/Base/Project/Src/Project/UnknownProject.cs @@ -42,5 +42,15 @@ namespace ICSharpCode.SharpDevelop.Project FileName = fileName; TypeGuid = "{00000000-0000-0000-0000-000000000000}"; } + + protected override ProjectBehavior GetOrCreateBehavior() + { + // don't add behaviors from AddIn-Tree to UnknownProject + lock (SyncRoot) { + if (projectBehavior == null) + projectBehavior = new DefaultProjectBehavior(this); + return projectBehavior; + } + } } } diff --git a/src/Main/Base/Test/WebReferences/WebReferenceTestHelper.cs b/src/Main/Base/Test/WebReferences/WebReferenceTestHelper.cs index 23b601b852..2c9e23889b 100644 --- a/src/Main/Base/Test/WebReferences/WebReferenceTestHelper.cs +++ b/src/Main/Base/Test/WebReferences/WebReferenceTestHelper.cs @@ -47,7 +47,7 @@ namespace ICSharpCode.SharpDevelop.Tests.WebReferences get { return ICSharpCode.SharpDevelop.Dom.LanguageProperties.CSharp; } } - protected override ProjectBehavior GetOrCreateBehavior() + protected override ProjectBehavior CreateDefaultBehavior() { return new DotNetStartBehavior(this, null); }