From 326071c3078d75a5fb36558ea17115687b5debd7 Mon Sep 17 00:00:00 2001 From: Eric Arndt Date: Wed, 7 May 2025 15:17:10 -0700 Subject: [PATCH 1/2] Reduce allocations in TaskExecutionHost --- .../TaskExecutionHost/TaskExecutionHost.cs | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/Build/BackEnd/TaskExecutionHost/TaskExecutionHost.cs b/src/Build/BackEnd/TaskExecutionHost/TaskExecutionHost.cs index 2f5a26be1fc..a168d42e635 100644 --- a/src/Build/BackEnd/TaskExecutionHost/TaskExecutionHost.cs +++ b/src/Build/BackEnd/TaskExecutionHost/TaskExecutionHost.cs @@ -24,6 +24,7 @@ using TaskItem = Microsoft.Build.Execution.ProjectItemInstance.TaskItem; using Task = System.Threading.Tasks.Task; +using Microsoft.Build.Collections; #nullable disable @@ -1423,11 +1424,27 @@ private void GatherTaskItemOutputs(bool outputTargetIsItem, string outputTargetN static IEnumerable> EnumerateMetadata(IDictionary customMetadata) { - foreach (DictionaryEntry de in customMetadata) + if (customMetadata is CopyOnWriteDictionary copyOnWriteDictionary) { - yield return new KeyValuePair((string)de.Key, EscapingUtilities.Escape((string)de.Value)); + foreach (KeyValuePair kvp in copyOnWriteDictionary) + { + yield return new KeyValuePair(kvp.Key, EscapingUtilities.Escape(kvp.Value)); + } + } + else if (customMetadata is Dictionary dictionary) + { + foreach (KeyValuePair kvp in dictionary) + { + yield return new KeyValuePair(kvp.Key, EscapingUtilities.Escape(kvp.Value)); + } + } + else + { + foreach (DictionaryEntry de in customMetadata) + { + yield return new KeyValuePair((string)de.Key, EscapingUtilities.Escape((string)de.Value)); + } } - } } } From cf381f3905189ccb3da2e388616ba21950931af3 Mon Sep 17 00:00:00 2001 From: Tomas Bartonek Date: Fri, 9 May 2025 14:29:56 +0200 Subject: [PATCH 2/2] Update TaskExecutionHost.cs I think this parenthesis was deleted by error. If it was a different one, more thorough look will be needed --- src/Build/BackEnd/TaskExecutionHost/TaskExecutionHost.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Build/BackEnd/TaskExecutionHost/TaskExecutionHost.cs b/src/Build/BackEnd/TaskExecutionHost/TaskExecutionHost.cs index a168d42e635..9523e2ea4ca 100644 --- a/src/Build/BackEnd/TaskExecutionHost/TaskExecutionHost.cs +++ b/src/Build/BackEnd/TaskExecutionHost/TaskExecutionHost.cs @@ -1445,6 +1445,7 @@ static IEnumerable> EnumerateMetadata(IDictionary c yield return new KeyValuePair((string)de.Key, EscapingUtilities.Escape((string)de.Value)); } } + } } }