From 035c60fb9066928de912b2ef5fdb557f2631a61b Mon Sep 17 00:00:00 2001 From: Suha Can Date: Thu, 4 Nov 2010 14:49:12 -0700 Subject: [PATCH] PERF: Fix for Memory leak when enabling/disabling a feature http://orchard.codeplex.com/workitem/16716 --HG-- branch : perf --- .../Environment/DefaultOrchardHostTests.cs | 2 ++ src/Orchard/Environment/DefaultOrchardHost.cs | 21 ++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/Orchard.Tests/Environment/DefaultOrchardHostTests.cs b/src/Orchard.Tests/Environment/DefaultOrchardHostTests.cs index 3de07ac2c..1a4aa66ec 100644 --- a/src/Orchard.Tests/Environment/DefaultOrchardHostTests.cs +++ b/src/Orchard.Tests/Environment/DefaultOrchardHostTests.cs @@ -81,6 +81,8 @@ namespace Orchard.Tests.Environment { _container.Mock() .Setup(e => e.Activated()); + _container.Mock() + .Setup(e => e.Terminating()).Callback(() => new object()); } public class StubExtensionManager : IExtensionManager { diff --git a/src/Orchard/Environment/DefaultOrchardHost.cs b/src/Orchard/Environment/DefaultOrchardHost.cs index 07fbcd8e7..7d5f0b5d1 100644 --- a/src/Orchard/Environment/DefaultOrchardHost.cs +++ b/src/Orchard/Environment/DefaultOrchardHost.cs @@ -1,6 +1,5 @@ using System.Linq; using System.Threading; -using System.Web.Mvc; using System.Collections.Generic; using Orchard.Caching; using Orchard.Environment.Configuration; @@ -11,10 +10,7 @@ using Orchard.Environment.Descriptor; using Orchard.Environment.Descriptor.Models; using Orchard.Localization; using Orchard.Logging; -using Orchard.Mvc; -using Orchard.Mvc.ViewEngines; using Orchard.Utility.Extensions; -using Autofac; namespace Orchard.Environment { public class DefaultOrchardHost : IOrchardHost, IShellSettingsManagerEventHandler, IShellDescriptorManagerEventHandler { @@ -62,7 +58,7 @@ namespace Orchard.Environment { } void IOrchardHost.ReloadExtensions() { - _current = null; + DisposeShellContext(); } void IOrchardHost.BeginRequest() { @@ -145,11 +141,20 @@ namespace Orchard.Environment { ctx => { _extensionLoaderCoordinator.MonitorExtensions(ctx.Monitor); _hostLocalRestart.Monitor(ctx.Monitor); - _current = null; + DisposeShellContext(); return ""; }); } + private void DisposeShellContext() { + if (_current != null) { + foreach (var shellContext in _current) { + shellContext.Shell.Terminate(); + } + _current = null; + } + } + protected virtual void BeginRequest() { MonitorExtensions(); BuildCurrent(); @@ -176,11 +181,11 @@ namespace Orchard.Environment { } void IShellSettingsManagerEventHandler.Saved(ShellSettings settings) { - _current = null; + DisposeShellContext(); } void IShellDescriptorManagerEventHandler.Changed(ShellDescriptor descriptor) { - _current = null; + DisposeShellContext(); } } }