diff options
author | Martin Broholm Andersen <090578@gmail.com> | 2024-08-31 12:23:02 +0200 |
---|---|---|
committer | Bob Arnson <github@bobs.org> | 2024-09-02 23:59:47 -0400 |
commit | fb769130df465bca45c520c27baf85343881ef14 (patch) | |
tree | 47809ab22fcaa859e369c41983404ba778cd5458 | |
parent | 4357d18fdc6908eab97886868596af3bd3121f2e (diff) | |
download | wix-fb769130df465bca45c520c27baf85343881ef14.tar.gz wix-fb769130df465bca45c520c27baf85343881ef14.tar.bz2 wix-fb769130df465bca45c520c27baf85343881ef14.zip |
Moved CalculateCabbingThreadCount() to BindDatabaseCommand because we need the capped value in both CreateCabinetsCommand and UpdateFileFacadesCommand.
Fixed bug in capping the thread count between 1 and processor count times 2. The "-ct 1000000" value was wrongly passed thru in the test CabinetFilesSequencedCorrectly
Added ThreadCount to UpdateFileFacadesCommand
3 files changed, 35 insertions, 31 deletions
diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs b/src/wix/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs index f1c5f851..bf073703 100644 --- a/src/wix/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs +++ b/src/wix/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs | |||
@@ -105,6 +105,29 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
105 | 105 | ||
106 | private CancellationToken CancellationToken { get; } | 106 | private CancellationToken CancellationToken { get; } |
107 | 107 | ||
108 | private int CalculateCabbingThreadCount() | ||
109 | { | ||
110 | var processorCount = Environment.ProcessorCount; | ||
111 | |||
112 | // If the number of processors is invalid, default to a single processor. | ||
113 | if (processorCount == 0) | ||
114 | { | ||
115 | processorCount = 1; | ||
116 | |||
117 | this.Messaging.Write(WarningMessages.InvalidEnvironmentVariable("NUMBER_OF_PROCESSORS", Environment.ProcessorCount.ToString(), processorCount.ToString())); | ||
118 | } | ||
119 | |||
120 | // If the cabbing thread count was provided, and it isn't more than double the number of processors, use it. | ||
121 | if (0 < this.CabbingThreadCount && this.CabbingThreadCount < processorCount * 2) | ||
122 | { | ||
123 | processorCount = this.CabbingThreadCount; | ||
124 | } | ||
125 | |||
126 | this.Messaging.Write(VerboseMessages.SetCabbingThreadCount(processorCount.ToString())); | ||
127 | |||
128 | return processorCount; | ||
129 | } | ||
130 | |||
108 | public IBindResult Execute() | 131 | public IBindResult Execute() |
109 | { | 132 | { |
110 | if (!this.Intermediate.HasLevel(Data.IntermediateLevels.Linked) || !this.Intermediate.HasLevel(Data.IntermediateLevels.Resolved)) | 133 | if (!this.Intermediate.HasLevel(Data.IntermediateLevels.Linked) || !this.Intermediate.HasLevel(Data.IntermediateLevels.Resolved)) |
@@ -123,6 +146,8 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
123 | 146 | ||
124 | var containsMergeModules = false; | 147 | var containsMergeModules = false; |
125 | 148 | ||
149 | int calculatedCabbingThreadCount = this.CalculateCabbingThreadCount(); | ||
150 | |||
126 | // Load standard tables, authored custom tables, and extension custom tables. | 151 | // Load standard tables, authored custom tables, and extension custom tables. |
127 | TableDefinitionCollection tableDefinitions; | 152 | TableDefinitionCollection tableDefinitions; |
128 | { | 153 | { |
@@ -280,7 +305,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
280 | 305 | ||
281 | // Gather information about files that do not come from merge modules. | 306 | // Gather information about files that do not come from merge modules. |
282 | { | 307 | { |
283 | var command = new UpdateFileFacadesCommand(this.Messaging, this.FileSystem, section, allFileFacades, fileFacadesFromIntermediate, variableCache, overwriteHash: true, this.CancellationToken); | 308 | var command = new UpdateFileFacadesCommand(this.Messaging, this.FileSystem, section, allFileFacades, fileFacadesFromIntermediate, variableCache, overwriteHash: true, this.CancellationToken, calculatedCabbingThreadCount); |
284 | command.Execute(); | 309 | command.Execute(); |
285 | } | 310 | } |
286 | 311 | ||
@@ -324,7 +349,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
324 | { | 349 | { |
325 | var updatedFacades = reresolvedFiles.Select(f => allFileFacades.First(ff => ff.Id == f.Id?.Id)); | 350 | var updatedFacades = reresolvedFiles.Select(f => allFileFacades.First(ff => ff.Id == f.Id?.Id)); |
326 | 351 | ||
327 | var command = new UpdateFileFacadesCommand(this.Messaging, this.FileSystem, section, allFileFacades, updatedFacades, variableCache, overwriteHash: false, this.CancellationToken); | 352 | var command = new UpdateFileFacadesCommand(this.Messaging, this.FileSystem, section, allFileFacades, updatedFacades, variableCache, overwriteHash: false, this.CancellationToken, calculatedCabbingThreadCount); |
328 | command.Execute(); | 353 | command.Execute(); |
329 | } | 354 | } |
330 | } | 355 | } |
@@ -442,7 +467,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
442 | { | 467 | { |
443 | this.Messaging.Write(VerboseMessages.CreatingCabinetFiles()); | 468 | this.Messaging.Write(VerboseMessages.CreatingCabinetFiles()); |
444 | 469 | ||
445 | var command = new CreateCabinetsCommand(this.ServiceProvider, this.Messaging, this.WindowsInstallerBackendHelper, this.BackendExtensions, section, this.CabCachePath, this.CabbingThreadCount, this.OutputPath, this.IntermediateFolder, this.DefaultCompressionLevel, compressed, modularizationSuffix, filesByCabinetMedia, data, tableDefinitions, this.ResolveMedia); | 470 | var command = new CreateCabinetsCommand(this.ServiceProvider, this.Messaging, this.WindowsInstallerBackendHelper, this.BackendExtensions, section, this.CabCachePath, calculatedCabbingThreadCount, this.OutputPath, this.IntermediateFolder, this.DefaultCompressionLevel, compressed, modularizationSuffix, filesByCabinetMedia, data, tableDefinitions, this.ResolveMedia); |
446 | command.Execute(); | 471 | command.Execute(); |
447 | 472 | ||
448 | fileTransfers.AddRange(command.FileTransfers); | 473 | fileTransfers.AddRange(command.FileTransfers); |
diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateCabinetsCommand.cs b/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateCabinetsCommand.cs index bf215623..e4815572 100644 --- a/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateCabinetsCommand.cs +++ b/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateCabinetsCommand.cs | |||
@@ -83,11 +83,9 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
83 | 83 | ||
84 | public void Execute() | 84 | public void Execute() |
85 | { | 85 | { |
86 | var calculatedCabbingThreadCount = this.CalculateCabbingThreadCount(); | ||
87 | |||
88 | this.GetMediaTemplateAttributes(out var maximumCabinetSizeForLargeFileSplitting, out var maximumUncompressedMediaSize); | 86 | this.GetMediaTemplateAttributes(out var maximumCabinetSizeForLargeFileSplitting, out var maximumUncompressedMediaSize); |
89 | 87 | ||
90 | var cabinetBuilder = new CabinetBuilder(this.Messaging, calculatedCabbingThreadCount, maximumCabinetSizeForLargeFileSplitting, maximumUncompressedMediaSize); | 88 | var cabinetBuilder = new CabinetBuilder(this.Messaging, this.CabbingThreadCount, maximumCabinetSizeForLargeFileSplitting, maximumUncompressedMediaSize); |
91 | 89 | ||
92 | var hashesByFileId = this.Section.Symbols.OfType<MsiFileHashSymbol>().ToDictionary(s => s.Id.Id); | 90 | var hashesByFileId = this.Section.Symbols.OfType<MsiFileHashSymbol>().ToDictionary(s => s.Id.Id); |
93 | 91 | ||
@@ -122,29 +120,6 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
122 | this.UpdateMediaWithSpannedCabinets(cabinetBuilder.CompletedCabinets); | 120 | this.UpdateMediaWithSpannedCabinets(cabinetBuilder.CompletedCabinets); |
123 | } | 121 | } |
124 | 122 | ||
125 | private int CalculateCabbingThreadCount() | ||
126 | { | ||
127 | var processorCount = Environment.ProcessorCount; | ||
128 | |||
129 | // If the number of processors is invalid, default to a single processor. | ||
130 | if (processorCount == 0) | ||
131 | { | ||
132 | processorCount = 1; | ||
133 | |||
134 | this.Messaging.Write(WarningMessages.InvalidEnvironmentVariable("NUMBER_OF_PROCESSORS", Environment.ProcessorCount.ToString(), processorCount.ToString())); | ||
135 | } | ||
136 | |||
137 | // If the cabbing thread count was provided, and it isn't more than double the number of processors, use it. | ||
138 | if (this.CabbingThreadCount > 0 && processorCount < this.CabbingThreadCount * 2) | ||
139 | { | ||
140 | processorCount = this.CabbingThreadCount; | ||
141 | } | ||
142 | |||
143 | this.Messaging.Write(VerboseMessages.SetCabbingThreadCount(processorCount.ToString())); | ||
144 | |||
145 | return processorCount; | ||
146 | } | ||
147 | |||
148 | private CabinetWorkItem CreateCabinetWorkItem(WindowsInstallerData data, string cabinetDir, MediaSymbol mediaSymbol, CompressionLevel compressionLevel, IEnumerable<IFileFacade> fileFacades, Dictionary<string, MsiFileHashSymbol> hashesByFileId) | 123 | private CabinetWorkItem CreateCabinetWorkItem(WindowsInstallerData data, string cabinetDir, MediaSymbol mediaSymbol, CompressionLevel compressionLevel, IEnumerable<IFileFacade> fileFacades, Dictionary<string, MsiFileHashSymbol> hashesByFileId) |
149 | { | 124 | { |
150 | CabinetWorkItem cabinetWorkItem = null; | 125 | CabinetWorkItem cabinetWorkItem = null; |
diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Bind/UpdateFileFacadesCommand.cs b/src/wix/WixToolset.Core.WindowsInstaller/Bind/UpdateFileFacadesCommand.cs index 5792fdcb..52d2146c 100644 --- a/src/wix/WixToolset.Core.WindowsInstaller/Bind/UpdateFileFacadesCommand.cs +++ b/src/wix/WixToolset.Core.WindowsInstaller/Bind/UpdateFileFacadesCommand.cs | |||
@@ -22,7 +22,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
22 | /// </summary> | 22 | /// </summary> |
23 | internal class UpdateFileFacadesCommand | 23 | internal class UpdateFileFacadesCommand |
24 | { | 24 | { |
25 | public UpdateFileFacadesCommand(IMessaging messaging, IFileSystem fileSystem, IntermediateSection section, IEnumerable<IFileFacade> allFileFacades, IEnumerable<IFileFacade> updateFileFacades, IDictionary<string, string> variableCache, bool overwriteHash, CancellationToken cancellationToken) | 25 | public UpdateFileFacadesCommand(IMessaging messaging, IFileSystem fileSystem, IntermediateSection section, IEnumerable<IFileFacade> allFileFacades, IEnumerable<IFileFacade> updateFileFacades, IDictionary<string, string> variableCache, bool overwriteHash, CancellationToken cancellationToken, int threadCount) |
26 | { | 26 | { |
27 | this.Messaging = messaging; | 27 | this.Messaging = messaging; |
28 | this.FileSystem = fileSystem; | 28 | this.FileSystem = fileSystem; |
@@ -32,6 +32,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
32 | this.VariableCache = variableCache; | 32 | this.VariableCache = variableCache; |
33 | this.OverwriteHash = overwriteHash; | 33 | this.OverwriteHash = overwriteHash; |
34 | this.CancellationToken = cancellationToken; | 34 | this.CancellationToken = cancellationToken; |
35 | this.ThreadCount = threadCount; | ||
35 | } | 36 | } |
36 | 37 | ||
37 | private IMessaging Messaging { get; } | 38 | private IMessaging Messaging { get; } |
@@ -50,6 +51,8 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
50 | 51 | ||
51 | private CancellationToken CancellationToken { get; } | 52 | private CancellationToken CancellationToken { get; } |
52 | 53 | ||
54 | private int ThreadCount { get; } | ||
55 | |||
53 | public void Execute() | 56 | public void Execute() |
54 | { | 57 | { |
55 | try | 58 | try |
@@ -74,7 +77,8 @@ namespace WixToolset.Core.WindowsInstaller.Bind | |||
74 | 77 | ||
75 | Parallel.ForEach(facades, | 78 | Parallel.ForEach(facades, |
76 | new ParallelOptions{ | 79 | new ParallelOptions{ |
77 | CancellationToken = this.CancellationToken | 80 | CancellationToken = this.CancellationToken, |
81 | MaxDegreeOfParallelism = this.ThreadCount | ||
78 | }, | 82 | }, |
79 | () => | 83 | () => |
80 | { | 84 | { |