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:
authorMichael Hutchinson <m.j.hutchinson@gmail.com>2011-08-01 05:09:43 +0400
committerMichael Hutchinson <m.j.hutchinson@gmail.com>2011-08-01 05:09:43 +0400
commitddc896bb187f185969a5edd765f586a25878d299 (patch)
tree492cb5bd19e94a149a3bfc8a4a6c2377050fac7d /main/src/core
parentc22940603b8674d9658f4b5061b96bd50c64dbcb (diff)
[Core] Fix more races in the assembly service
Diffstat (limited to 'main/src/core')
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MsNetTargetRuntime.cs2
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/SystemAssemblyService.cs31
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/TargetRuntime.cs5
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;