From e516b54de27993e882bf8c3950adc2df8ef70792 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 b207c5e4794e4..be9eded41afeb 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.Collections; using System.Collections.Generic; using System.IO; +using System.Linq; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; using Mono.XBuild.Utilities; @@ -311,8 +312,10 @@ public Project GetLoadedProject (string projectFullFileName) 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) @@ -331,8 +334,7 @@ public void UnloadProject (Project project) project.CheckUnloaded (); - if (project.FullFileName != String.Empty) - projects.Remove (project.FullFileName); + RemoveLoadedProject (project); project.Unload (); } @@ -404,6 +406,14 @@ internal void EndProjectBuild (Project project, bool succeeded) } } + 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 cba8f82fc2fa4..9cf7ff582ea37 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 @@ public class Project { XmlDocument xmlDocument; bool unloaded; bool initialTargetsBuilt; - List builtTargetKeys; bool building; BuildSettings current_settings; Stack batches; @@ -111,7 +110,6 @@ public Project (Engine engine, string toolsVersion) encoding = null; - builtTargetKeys = new List (); initialTargets = new List (); defaultTargets = new string [0]; batches = new Stack (); @@ -351,9 +349,16 @@ bool BuildTarget (string target_name, IDictionary targetOutputs) } 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 @@ void Evaluate () // 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 @@ internal void LogWarning (string filename, string message, params object[] messa 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 158ffdef94bc4..beb7c581dab54 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 @@ bool Build (string built_targets_key, out bool executeOnErrors) } project.ParentEngine.BuiltTargetsOutputByName [built_targets_key] = (ITaskItem[]) Outputs.Clone (); - project.BuiltTargetKeys.Add (built_targets_key); return result; }