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:
authorDavid Karlaš <david.karlas@microsoft.com>2018-04-26 17:08:42 +0300
committerDavid Karlaš <david.karlas@microsoft.com>2018-04-26 17:08:42 +0300
commit7d78c490f9cd68c49597afabe57a338e9a49a859 (patch)
treeda1d735d4cdb82876aca38701732e4af3eb43de1
parent1ba65a7d3b1b8a14c7c136f1f16605f0b4c64a1a (diff)
prototype using MEF cache without loading assembliesmef-fixes-skipLoadingAddins
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Composition/CompositionManager.Caching.cs11
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Composition/CompositionManager.cs25
-rw-r--r--main/tests/Ide.Tests/MonoDevelop.Ide.Composition/CompositionManager.CachingTests.cs4
3 files changed, 18 insertions, 22 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Composition/CompositionManager.Caching.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Composition/CompositionManager.Caching.cs
index e9db664248..4faf576ffa 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Composition/CompositionManager.Caching.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Composition/CompositionManager.Caching.cs
@@ -57,11 +57,11 @@ namespace MonoDevelop.Ide.Composition
internal static bool writeCache;
ICachingFaultInjector cachingFaultInjector;
Task saveTask;
- public HashSet<Assembly> Assemblies { get; }
+ public HashSet<string> Assemblies { get; }
internal string MefCacheFile { get; }
internal string MefCacheControlFile { get; }
- public Caching (HashSet<Assembly> assemblies, Func<string, string> getCacheFilePath = null, ICachingFaultInjector cachingFaultInjector = null)
+ public Caching (HashSet<string> assemblies, Func<string, string> getCacheFilePath = null, ICachingFaultInjector cachingFaultInjector = null)
{
getCacheFilePath = getCacheFilePath ?? (file => Path.Combine (AddinManager.CurrentAddin.PrivateDataPath, file));
@@ -120,10 +120,9 @@ namespace MonoDevelop.Ide.Composition
return false;
// Validate that the assemblies match and we have the same time stamps on them.
- var currentAssemblies = new HashSet<string> (Assemblies.Select (asm => asm.Location));
foreach (var assemblyInfo in controlCache.AssemblyInfos) {
cachingFaultInjector?.FaultAssemblyInfo (assemblyInfo);
- if (!currentAssemblies.Contains (assemblyInfo.Location))
+ if (!Assemblies.Contains (assemblyInfo.Location))
return false;
if (File.GetLastWriteTimeUtc (assemblyInfo.Location) != assemblyInfo.LastWriteTimeUtc)
@@ -170,8 +169,8 @@ namespace MonoDevelop.Ide.Composition
// Create cache control data.
var controlCache = new MefControlCache {
AssemblyInfos = Assemblies.Select (asm => new MefControlCacheAssemblyInfo {
- Location = asm.Location,
- LastWriteTimeUtc = File.GetLastWriteTimeUtc (asm.Location),
+ Location = asm,
+ LastWriteTimeUtc = File.GetLastWriteTimeUtc (asm),
}).ToArray (),
};
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Composition/CompositionManager.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Composition/CompositionManager.cs
index d3919c2328..6094e10bc8 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Composition/CompositionManager.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Composition/CompositionManager.cs
@@ -124,14 +124,14 @@ namespace MonoDevelop.Ide.Composition
async Task InitializeInstanceAsync ()
{
- var assemblies = ReadAssembliesFromAddins ();
+ var assemblies = ReadAssembliesFromAddins (false);
var caching = new Caching (assemblies);
// Try to use cached MEF data
if (caching.CanUse ()) {
RuntimeComposition = await TryCreateRuntimeCompositionFromCache (caching);
}
-
+ ReadAssembliesFromAddins (true);
// Otherwise fallback to runtime discovery.
if (RuntimeComposition == null) {
RuntimeComposition = await CreateRuntimeCompositionFromDiscovery (caching);
@@ -205,31 +205,28 @@ namespace MonoDevelop.Ide.Composition
}
}
- internal static HashSet<Assembly> ReadAssembliesFromAddins ()
+ internal static HashSet<string> ReadAssembliesFromAddins (bool load)
{
using (var timer = Counters.CompositionAddinLoad.BeginTiming ()) {
- HashSet<Assembly> assemblies = new HashSet<Assembly> ();
+ var assemblies = new HashSet<string> ();
ReadAssemblies (assemblies, "/MonoDevelop/Ide/TypeService/PlatformMefHostServices", timer);
ReadAssemblies (assemblies, "/MonoDevelop/Ide/TypeService/MefHostServices", timer);
ReadAssemblies (assemblies, "/MonoDevelop/Ide/Composition", timer);
return assemblies;
}
- void ReadAssemblies (HashSet<Assembly> assemblies, string extensionPath, ITimeTracker timer)
+ void ReadAssemblies (HashSet<string> assemblies, string extensionPath, ITimeTracker timer)
{
foreach (var node in AddinManager.GetExtensionNodes (extensionPath)) {
if (node is AssemblyExtensionNode assemblyNode) {
try {
string id = assemblyNode.Addin.Id;
- timer.Trace ("Start: " + id);
- // Make sure the add-in that registered the assembly is loaded, since it can bring other
- // other assemblies required to load this one
- AddinManager.LoadAddin (null, assemblyNode.Addin.Id);
-
- var assemblyFilePath = assemblyNode.Addin.GetFilePath (assemblyNode.FileName);
- var assembly = Runtime.SystemAssemblyService.LoadAssemblyFrom (assemblyFilePath);
- assemblies.Add (assembly);
-
+ timer.Trace ("Start: " + id);
+ // Make sure the add-in that registered the assembly is loaded, since it can bring other
+ // other assemblies required to load this one
+ if (load)
+ AddinManager.LoadAddin (null, assemblyNode.Addin.Id);
+ assemblies.Add (assemblyNode.Addin.GetFilePath (assemblyNode.FileName));
timer.Trace ("Loaded: " + id);
} catch (Exception e) {
LoggingService.LogError ("Composition can't load assembly " + assemblyNode.FileName, e);
diff --git a/main/tests/Ide.Tests/MonoDevelop.Ide.Composition/CompositionManager.CachingTests.cs b/main/tests/Ide.Tests/MonoDevelop.Ide.Composition/CompositionManager.CachingTests.cs
index 0b2905727d..55258e3624 100644
--- a/main/tests/Ide.Tests/MonoDevelop.Ide.Composition/CompositionManager.CachingTests.cs
+++ b/main/tests/Ide.Tests/MonoDevelop.Ide.Composition/CompositionManager.CachingTests.cs
@@ -182,7 +182,7 @@ namespace MonoDevelop.Ide.Composition
await caching.Write (composition, cacheManager);
- caching.Assemblies.Add (typeof (Console).Assembly);
+ caching.Assemblies.Add (typeof (Console).Assembly.Location);
Assert.IsFalse (caching.CanUse ());
}
@@ -198,7 +198,7 @@ namespace MonoDevelop.Ide.Composition
await caching.Write (composition, cacheManager);
- caching.Assemblies.Add (typeof (Console).Assembly);
+ caching.Assemblies.Add (typeof (Console).Assembly.Location);
Assert.IsFalse (caching.CanUse ());
}