diff options
author | Michael Hutchinson <m.j.hutchinson@gmail.com> | 2011-08-01 05:09:43 +0400 |
---|---|---|
committer | Michael Hutchinson <m.j.hutchinson@gmail.com> | 2011-08-01 05:09:43 +0400 |
commit | ddc896bb187f185969a5edd765f586a25878d299 (patch) | |
tree | 492cb5bd19e94a149a3bfc8a4a6c2377050fac7d /main/src/core | |
parent | c22940603b8674d9658f4b5061b96bd50c64dbcb (diff) |
[Core] Fix more races in the assembly service
Diffstat (limited to 'main/src/core')
3 files changed, 30 insertions, 8 deletions
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MsNetTargetRuntime.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MsNetTargetRuntime.cs index 0036d5d544..db4c67e054 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MsNetTargetRuntime.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MsNetTargetRuntime.cs @@ -100,7 +100,7 @@ namespace MonoDevelop.Core.Assemblies // Extended assembly folders - foreach (TargetFramework fx in Runtime.SystemAssemblyService.GetTargetFrameworks ()) { + foreach (TargetFramework fx in Runtime.SystemAssemblyService.GetCoreFrameworks ()) { if (fx.Id.Identifier != ".NETFramework") continue; if (ShuttingDown) diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/SystemAssemblyService.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/SystemAssemblyService.cs index c6832be210..73f9982c18 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/SystemAssemblyService.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/SystemAssemblyService.cs @@ -72,8 +72,7 @@ namespace MonoDevelop.Core.Assemblies // Don't initialize until Current and Default Runtimes are set foreach (TargetRuntime runtime in runtimes) { - runtime.Initialized += HandleRuntimeInitialized; - runtime.StartInitialization (); + InitializeRuntime (runtime); } if (CurrentRuntime == null) @@ -85,6 +84,12 @@ namespace MonoDevelop.Core.Assemblies }; } + void InitializeRuntime (TargetRuntime runtime) + { + runtime.Initialized += HandleRuntimeInitialized; + runtime.StartInitialization (); + } + void HandleRuntimeInitialized (object sender, EventArgs e) { var runtime = (TargetRuntime) sender; @@ -100,8 +105,21 @@ namespace MonoDevelop.Core.Assemblies } } + //we initialize runtimes in threads, but consumers of this service aren't aware that runtimes + //can be in an uninialized state, so we consider the initialization as purely an opportunistic + //attempt at startup parallization, and block as soon as anything actually tries to access the + //runtime objects + void CheckRuntimesInitialized () + { + foreach (var r in runtimes) { + if (!r.IsInitialized) + r.Initialize (); + } + } + public TargetRuntime DefaultRuntime { get { + CheckRuntimesInitialized (); return defaultRuntime; } set { @@ -121,8 +139,7 @@ namespace MonoDevelop.Core.Assemblies public void RegisterRuntime (TargetRuntime runtime) { - runtime.Initialized += HandleRuntimeInitialized; - runtime.StartInitialization (); + InitializeRuntime (runtime); runtimes.Add (runtime); if (RuntimesChanged != null) RuntimesChanged (this, EventArgs.Empty); @@ -146,16 +163,19 @@ namespace MonoDevelop.Core.Assemblies public IEnumerable<TargetFramework> GetTargetFrameworks () { + CheckRuntimesInitialized (); return frameworks.Values; } public IEnumerable<TargetRuntime> GetTargetRuntimes () { + CheckRuntimesInitialized (); return runtimes; } public TargetRuntime GetTargetRuntime (string id) { + CheckRuntimesInitialized (); foreach (TargetRuntime r in runtimes) { if (r.Id == id) return r; @@ -165,6 +185,7 @@ namespace MonoDevelop.Core.Assemblies public IEnumerable<TargetRuntime> GetTargetRuntimes (string runtimeId) { + CheckRuntimesInitialized (); foreach (TargetRuntime r in runtimes) { if (r.RuntimeId == runtimeId) yield return r; @@ -173,6 +194,7 @@ namespace MonoDevelop.Core.Assemblies public TargetFramework GetTargetFramework (TargetFrameworkMoniker id) { + CheckRuntimesInitialized (); return GetTargetFramework (id, frameworks); } @@ -189,6 +211,7 @@ namespace MonoDevelop.Core.Assemblies public SystemPackage GetPackageFromPath (string assemblyPath) { + CheckRuntimesInitialized (); foreach (TargetRuntime r in runtimes) { SystemPackage p = r.AssemblyContext.GetPackageFromPath (assemblyPath); if (p != null) diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/TargetRuntime.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/TargetRuntime.cs index 91adb4968b..0764a670fc 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/TargetRuntime.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/TargetRuntime.cs @@ -51,7 +51,8 @@ namespace MonoDevelop.Core.Assemblies object initLock = new object (); object initEventLock = new object (); bool initialized; - Dictionary<TargetFrameworkMoniker,TargetFrameworkBackend> frameworkBackends; + Dictionary<TargetFrameworkMoniker,TargetFrameworkBackend> frameworkBackends + = new Dictionary<TargetFrameworkMoniker, TargetFrameworkBackend> (); RuntimeAssemblyContext assemblyContext; ComposedAssemblyContext composedAssemblyContext; @@ -280,8 +281,6 @@ namespace MonoDevelop.Core.Assemblies protected TargetFrameworkBackend GetBackend (TargetFramework fx) { lock (frameworkBackends) { - if (frameworkBackends == null) - frameworkBackends = new Dictionary<TargetFrameworkMoniker, TargetFrameworkBackend> (); TargetFrameworkBackend backend; if (frameworkBackends.TryGetValue (fx.Id, out backend)) return backend; |