From 925c4ffa62dcacacb529c27ad5bd9b791bf8fa96 Mon Sep 17 00:00:00 2001 From: Jacques Eloff Date: Thu, 2 Sep 2021 13:21:08 -0700 Subject: [PATCH] Lock task item arrays --- .../src/GenerateMsiBase.cs | 17 +++++++++++++++-- .../src/GenerateWorkloadMsis.cs | 18 ++++++++++++++++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs index 11b7560fa4b..fe351813b94 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateMsiBase.cs @@ -115,6 +115,11 @@ public string SuppressIces /// private readonly object extractNuGetLock = new object(); + /// + /// Used to syncrhonize access to MSI task items. + /// + private readonly object msiTaskItemsLock = new(); + /// /// Generate a set of MSIs for the specified platforms using the specified NuGet package. /// @@ -124,11 +129,16 @@ public string SuppressIces protected IEnumerable Generate(string sourcePackage, string swixPackageId, string outputPath, WorkloadPackKind kind, params string[] platforms) { NugetPackage nupkg = null; + List msis = null; + lock (extractNuGetLock) { nupkg = new(sourcePackage, Log); } - List msis = new(); + lock (msiTaskItemsLock) + { + msis = new(); + } // MSI ProductName defaults to the package title and fallback to the package ID with a warning. string productName = nupkg.Title; @@ -310,7 +320,10 @@ protected IEnumerable Generate(string sourcePackage, string swixPacka // Generate a .csproj to build a NuGet payload package to carry the MSI and JSON manifest msi.SetMetadata(Metadata.PackageProject, GeneratePackageProject(msi.ItemSpec, msiJsonPath, platform, nupkg)); - msis.Add(msi); + lock (msiTaskItemsLock) + { + msis.Add(msi); + } }); return msis; diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs index 50340821555..6acc58554ed 100644 --- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs +++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs @@ -45,11 +45,20 @@ public ITaskItem[] MissingPacks set; } + /// + /// Used for synchronizing on MSI task item. + /// + private readonly object msiTaskItemsLock = new(); + public override bool Execute() { try { - List msis = new(); + List msis = null; + lock (msiTaskItemsLock) + { + msis = new(); + } List missingPacks = new(); if (string.IsNullOrWhiteSpace(PackagesPath)) @@ -96,7 +105,12 @@ public override bool Execute() System.Threading.Tasks.Parallel.ForEach(packsToGenerate, p => { - msis.AddRange(Generate(p.sourcePackage, p.swixPackageId, p.outputPath, p.kind, p.platforms)); + var msiItems = Generate(p.sourcePackage, p.swixPackageId, p.outputPath, p.kind, p.platforms); + + lock (msiTaskItemsLock) + { + msis.AddRange(msiItems); + } }); Msis = msis.ToArray();