From 8d04b0aabd75766733204729816d35900d9271bf Mon Sep 17 00:00:00 2001 From: Ankit Jain Date: Fri, 14 Jan 2011 01:20:00 +0530 Subject: [PATCH] [xbuild] Clear the built targets cache on project unload. Remove the entries for a project from the built targets cache, on project unload. * Microsoft.Build.BuildEngine/Engine.cs (ClearBuiltTargetsForProject): New. * Microsoft.Build.BuildEngine/Project.cs (BuiltTargetKeys): Remove. (RemoveBuiltTargets): Use Engine.ClearBuiltTargetsForProject . * Microsoft.Build.BuildEngine/Target.cs: Track api changes. * --- .../Microsoft.Build.BuildEngine/Engine.cs | 16 +++++++++++++--- .../Microsoft.Build.BuildEngine/Project.cs | 18 +++++++++--------- .../Microsoft.Build.BuildEngine/Target.cs | 1 - 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Engine.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Engine.cs index 3a41134c81d..8f7bc6d4b7a 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Engine.cs +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Engine.cs @@ -31,6 +31,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.IO; +using System.Linq; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; using Mono.XBuild.Utilities; @@ -308,8 +309,10 @@ namespace Microsoft.Build.BuildEngine { internal void RemoveLoadedProject (Project p) { - if (p.FullFileName != String.Empty) + if (!String.IsNullOrEmpty (p.FullFileName)) { + ClearBuiltTargetsForProject (p); projects.Remove (p.FullFileName); + } } internal void AddLoadedProject (Project p) @@ -328,8 +331,7 @@ namespace Microsoft.Build.BuildEngine { project.CheckUnloaded (); - if (project.FullFileName != String.Empty) - projects.Remove (project.FullFileName); + RemoveLoadedProject (project); project.Unload (); } @@ -401,6 +403,14 @@ namespace Microsoft.Build.BuildEngine { } } + internal void ClearBuiltTargetsForProject (Project project) + { + string project_key = project.GetKeyForTarget (String.Empty, false); + var to_remove_keys = BuiltTargetsOutputByName.Keys.Where (key => key.StartsWith (project_key)).ToList (); + foreach (string to_remove_key in to_remove_keys) + BuiltTargetsOutputByName.Remove (to_remove_key); + } + void LogProjectStarted (Project project, string [] target_names) { string targets; diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs index cba8f82fc2f..9cf7ff582ea 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs @@ -73,7 +73,6 @@ namespace Microsoft.Build.BuildEngine { XmlDocument xmlDocument; bool unloaded; bool initialTargetsBuilt; - List builtTargetKeys; bool building; BuildSettings current_settings; Stack batches; @@ -111,7 +110,6 @@ namespace Microsoft.Build.BuildEngine { encoding = null; - builtTargetKeys = new List (); initialTargets = new List (); defaultTargets = new string [0]; batches = new Stack (); @@ -352,8 +350,15 @@ namespace Microsoft.Build.BuildEngine { internal string GetKeyForTarget (string target_name) { + return GetKeyForTarget (target_name, true); + } + + internal string GetKeyForTarget (string target_name, bool include_global_properties) + { // target name is case insensitive - return fullFileName + ":" + target_name.ToLower () + ":" + GlobalPropertiesToString (GlobalProperties); + return fullFileName + ":" + target_name.ToLower () + + (include_global_properties ? (":" + GlobalPropertiesToString (GlobalProperties)) + : String.Empty); } string GlobalPropertiesToString (BuildPropertyGroup bgp) @@ -896,8 +901,7 @@ namespace Microsoft.Build.BuildEngine { // Removes entries of all earlier built targets for this project void RemoveBuiltTargets () { - foreach (string key in builtTargetKeys) - ParentEngine.BuiltTargetsOutputByName.Remove (key); + ParentEngine.ClearBuiltTargetsForProject (this); } void InitializeProperties (string effective_tools_version) @@ -1396,10 +1400,6 @@ namespace Microsoft.Build.BuildEngine { get; internal set; } - internal List BuiltTargetKeys { - get { return builtTargetKeys; } - } - internal Dictionary LastItemGroupContaining { get { return last_item_group_containing; } } diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Target.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Target.cs index 158ffdef94b..beb7c581dab 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Target.cs +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Target.cs @@ -165,7 +165,6 @@ namespace Microsoft.Build.BuildEngine { } project.ParentEngine.BuiltTargetsOutputByName [built_targets_key] = (ITaskItem[]) Outputs.Clone (); - project.BuiltTargetKeys.Add (built_targets_key); return result; } -- 2.11.4.GIT