diff options
author | David Karlaš <david.karlas@microsoft.com> | 2018-04-26 17:08:42 +0300 |
---|---|---|
committer | David Karlaš <david.karlas@microsoft.com> | 2018-04-26 17:08:42 +0300 |
commit | 7d78c490f9cd68c49597afabe57a338e9a49a859 (patch) | |
tree | da1d735d4cdb82876aca38701732e4af3eb43de1 | |
parent | 1ba65a7d3b1b8a14c7c136f1f16605f0b4c64a1a (diff) |
prototype using MEF cache without loading assembliesmef-fixes-skipLoadingAddins
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 ()); } |