From ac14a3a1f4aded7c898d6c68bbab80c33cf5fc85 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Tue, 14 Mar 2017 20:28:23 -0700 Subject: [PATCH] [Globals] Make parallel options easier to use --- SabreTools.Helper/Data/Globals.cs | 15 ++- .../Dats/Partials/DatFile.Bucketing.cs | 6 +- .../Dats/Partials/DatFile.ConvertUpdate.cs | 10 +- .../Dats/Partials/DatFile.DFD.cs | 114 +++++++++--------- SabreTools.Helper/External/Traverse.cs | 4 +- 5 files changed, 80 insertions(+), 69 deletions(-) diff --git a/SabreTools.Helper/Data/Globals.cs b/SabreTools.Helper/Data/Globals.cs index 71d37a1d..a533b038 100644 --- a/SabreTools.Helper/Data/Globals.cs +++ b/SabreTools.Helper/Data/Globals.cs @@ -1,4 +1,6 @@ -namespace SabreTools.Helper.Data +using System.Threading.Tasks; + +namespace SabreTools.Helper.Data { public class Globals { @@ -25,9 +27,18 @@ } public static int MaxDegreeOfParallelism { - get { return _maxDegreeOfParallelism; } set { _maxDegreeOfParallelism = value; } } + public static ParallelOptions ParallelOptions + { + get + { + return new ParallelOptions() + { + MaxDegreeOfParallelism = _maxDegreeOfParallelism + }; + } + } #endregion } diff --git a/SabreTools.Helper/Dats/Partials/DatFile.Bucketing.cs b/SabreTools.Helper/Dats/Partials/DatFile.Bucketing.cs index 00d4b65e..8aae7d8d 100644 --- a/SabreTools.Helper/Dats/Partials/DatFile.Bucketing.cs +++ b/SabreTools.Helper/Dats/Partials/DatFile.Bucketing.cs @@ -40,14 +40,14 @@ namespace SabreTools.Helper.Dats // First do the initial sort of all of the roms List keys = Keys.ToList(); Parallel.ForEach(keys, - new ParallelOptions() { MaxDegreeOfParallelism = Globals.MaxDegreeOfParallelism }, + Globals.ParallelOptions, key => { List roms = this[key]; // Now add each of the roms to their respective games Parallel.ForEach(roms, - new ParallelOptions() { MaxDegreeOfParallelism = Globals.MaxDegreeOfParallelism }, + Globals.ParallelOptions, rom => { string newkey = ""; @@ -125,7 +125,7 @@ namespace SabreTools.Helper.Dats // Now go through and sort all of the individual lists keys = sortable.Keys.ToList(); Parallel.ForEach(keys, - new ParallelOptions() { MaxDegreeOfParallelism = Globals.MaxDegreeOfParallelism }, + Globals.ParallelOptions, key => { // Get the possibly unsorted list diff --git a/SabreTools.Helper/Dats/Partials/DatFile.ConvertUpdate.cs b/SabreTools.Helper/Dats/Partials/DatFile.ConvertUpdate.cs index a8516e68..4373e013 100644 --- a/SabreTools.Helper/Dats/Partials/DatFile.ConvertUpdate.cs +++ b/SabreTools.Helper/Dats/Partials/DatFile.ConvertUpdate.cs @@ -103,7 +103,7 @@ namespace SabreTools.Helper.Dats // Parse all of the DATs into their own DatFiles in the array Parallel.For(0, inputs.Count, - new ParallelOptions { MaxDegreeOfParallelism = Globals.MaxDegreeOfParallelism }, + Globals.ParallelOptions, i => { string input = inputs[i]; @@ -122,13 +122,13 @@ namespace SabreTools.Helper.Dats Globals.Logger.User("Populating internal DAT"); Parallel.For(0, inputs.Count, - new ParallelOptions() { MaxDegreeOfParallelism = Globals.MaxDegreeOfParallelism }, + Globals.ParallelOptions, i => { // Get the list of keys from the DAT List keys = datHeaders[i].Keys.ToList(); Parallel.ForEach(keys, - new ParallelOptions() { MaxDegreeOfParallelism = Globals.MaxDegreeOfParallelism }, + Globals.ParallelOptions, key => { // Add everything from the key to the internal DAT @@ -536,7 +536,7 @@ namespace SabreTools.Helper.Dats SplitType splitType, bool trim, bool single, string root) { Parallel.ForEach(inputFileNames, - new ParallelOptions { MaxDegreeOfParallelism = Globals.MaxDegreeOfParallelism }, + Globals.ParallelOptions, inputFileName => { // Clean the input string @@ -561,7 +561,7 @@ namespace SabreTools.Helper.Dats inputFileName = Path.GetFullPath(inputFileName) + Path.DirectorySeparatorChar; Parallel.ForEach(Directory.EnumerateFiles(inputFileName, "*", SearchOption.AllDirectories), - new ParallelOptions { MaxDegreeOfParallelism = Globals.MaxDegreeOfParallelism }, + Globals.ParallelOptions, file => { Globals.Logger.User("Processing \"" + Path.GetFullPath(file).Remove(0, inputFileName.Length) + "\""); diff --git a/SabreTools.Helper/Dats/Partials/DatFile.DFD.cs b/SabreTools.Helper/Dats/Partials/DatFile.DFD.cs index 38035342..7989e990 100644 --- a/SabreTools.Helper/Dats/Partials/DatFile.DFD.cs +++ b/SabreTools.Helper/Dats/Partials/DatFile.DFD.cs @@ -66,28 +66,28 @@ namespace SabreTools.Helper.Dats // Process the files in the main folder List files = Directory.EnumerateFiles(basePath, "*", SearchOption.TopDirectoryOnly).ToList(); Parallel.ForEach(files, - new ParallelOptions { MaxDegreeOfParallelism = Globals.MaxDegreeOfParallelism }, + Globals.ParallelOptions, item => - { - PopulateFromDirCheckFile(item, basePath, omitFromScan, bare, archivesAsFiles, enableGzip, addBlanks, addDate, - tempDir, copyFiles, headerToCheckAgainst); - }); + { + PopulateFromDirCheckFile(item, basePath, omitFromScan, bare, archivesAsFiles, enableGzip, addBlanks, addDate, + tempDir, copyFiles, headerToCheckAgainst); + }); // Find all top-level subfolders files = Directory.EnumerateDirectories(basePath, "*", SearchOption.TopDirectoryOnly).ToList(); Parallel.ForEach(files, - new ParallelOptions { MaxDegreeOfParallelism = Globals.MaxDegreeOfParallelism }, + Globals.ParallelOptions, item => - { - List subfiles = Directory.EnumerateFiles(item, "*", SearchOption.AllDirectories).ToList(); - Parallel.ForEach(subfiles, - new ParallelOptions { MaxDegreeOfParallelism = Globals.MaxDegreeOfParallelism }, - subitem => - { - PopulateFromDirCheckFile(subitem, basePath, omitFromScan, bare, archivesAsFiles, enableGzip, addBlanks, addDate, - tempDir, copyFiles, headerToCheckAgainst); - }); - }); + { + List subfiles = Directory.EnumerateFiles(item, "*", SearchOption.AllDirectories).ToList(); + Parallel.ForEach(subfiles, + Globals.ParallelOptions, + subitem => + { + PopulateFromDirCheckFile(subitem, basePath, omitFromScan, bare, archivesAsFiles, enableGzip, addBlanks, addDate, + tempDir, copyFiles, headerToCheckAgainst); + }); + }); // Now find all folders that are empty, if we are supposed to if (!Romba && addBlanks) @@ -98,50 +98,50 @@ namespace SabreTools.Helper.Dats .ToList(); Parallel.ForEach(empties, - new ParallelOptions { MaxDegreeOfParallelism = Globals.MaxDegreeOfParallelism }, + Globals.ParallelOptions, dir => + { + // Get the full path for the directory + string fulldir = Path.GetFullPath(dir); + + // Set the temporary variables + string gamename = ""; + string romname = ""; + + // If we have a SuperDAT, we want anything that's not the base path as the game, and the file as the rom + if (Type == "SuperDAT") { - // Get the full path for the directory - string fulldir = Path.GetFullPath(dir); + gamename = fulldir.Remove(0, basePath.Length + 1); + romname = "-"; + } - // Set the temporary variables - string gamename = ""; - string romname = ""; + // Otherwise, we want just the top level folder as the game, and the file as everything else + else + { + gamename = fulldir.Remove(0, basePath.Length + 1).Split(Path.DirectorySeparatorChar)[0]; + romname = Path.Combine(fulldir.Remove(0, basePath.Length + 1 + gamename.Length), "-"); + } - // If we have a SuperDAT, we want anything that's not the base path as the game, and the file as the rom - if (Type == "SuperDAT") - { - gamename = fulldir.Remove(0, basePath.Length + 1); - romname = "-"; - } + // Sanitize the names + if (gamename.StartsWith(Path.DirectorySeparatorChar.ToString())) + { + gamename = gamename.Substring(1); + } + if (gamename.EndsWith(Path.DirectorySeparatorChar.ToString())) + { + gamename = gamename.Substring(0, gamename.Length - 1); + } + if (romname.StartsWith(Path.DirectorySeparatorChar.ToString())) + { + romname = romname.Substring(1); + } + if (romname.EndsWith(Path.DirectorySeparatorChar.ToString())) + { + romname = romname.Substring(0, romname.Length - 1); + } - // Otherwise, we want just the top level folder as the game, and the file as everything else - else - { - gamename = fulldir.Remove(0, basePath.Length + 1).Split(Path.DirectorySeparatorChar)[0]; - romname = Path.Combine(fulldir.Remove(0, basePath.Length + 1 + gamename.Length), "-"); - } - - // Sanitize the names - if (gamename.StartsWith(Path.DirectorySeparatorChar.ToString())) - { - gamename = gamename.Substring(1); - } - if (gamename.EndsWith(Path.DirectorySeparatorChar.ToString())) - { - gamename = gamename.Substring(0, gamename.Length - 1); - } - if (romname.StartsWith(Path.DirectorySeparatorChar.ToString())) - { - romname = romname.Substring(1); - } - if (romname.EndsWith(Path.DirectorySeparatorChar.ToString())) - { - romname = romname.Substring(0, romname.Length - 1); - } - - Globals.Logger.Verbose("Adding blank empty folder: " + gamename); - this["null"].Add(new Rom(romname, gamename, omitFromScan)); + Globals.Logger.Verbose("Adding blank empty folder: " + gamename); + this["null"].Add(new Rom(romname, gamename, omitFromScan)); }); } } @@ -260,7 +260,7 @@ namespace SabreTools.Helper.Dats Globals.Logger.Verbose(Path.GetFileName(item) + " treated like an archive"); List extracted = Directory.EnumerateFiles(tempSubDir, "*", SearchOption.AllDirectories).ToList(); Parallel.ForEach(extracted, - new ParallelOptions { MaxDegreeOfParallelism = Globals.MaxDegreeOfParallelism }, + Globals.ParallelOptions, entry => { PopulateFromDirProcessFile(entry, @@ -284,7 +284,7 @@ namespace SabreTools.Helper.Dats .ToList(); Parallel.ForEach(empties, - new ParallelOptions { MaxDegreeOfParallelism = Globals.MaxDegreeOfParallelism }, + Globals.ParallelOptions, dir => { // Get the full path for the directory diff --git a/SabreTools.Helper/External/Traverse.cs b/SabreTools.Helper/External/Traverse.cs index 237d13c0..9a1ab598 100644 --- a/SabreTools.Helper/External/Traverse.cs +++ b/SabreTools.Helper/External/Traverse.cs @@ -39,7 +39,7 @@ namespace SabreTools.Helper.External subdirs.Clear(); Parallel.ForEach(dirs, - new ParallelOptions() { MaxDegreeOfParallelism = Globals.MaxDegreeOfParallelism }, + Globals.ParallelOptions, currentDir => { string[] subDirs = Directory.GetDirectories(currentDir); @@ -57,7 +57,7 @@ namespace SabreTools.Helper.External { FileInfo[] files = dir.GetFiles("*.*", SearchOption.TopDirectoryOnly); Parallel.ForEach(files, - new ParallelOptions() { MaxDegreeOfParallelism = Globals.MaxDegreeOfParallelism }, + Globals.ParallelOptions, info => { action(info);