From 4f04cbbcc8a976d04d22e4351f3df1aee7cc4ef0 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Tue, 26 Nov 2013 17:40:30 +0000 Subject: [PATCH] fix hangs when both textfiles and zip are present in cardsfolder --- .../main/java/forge/CardStorageReader.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/forge-core/src/main/java/forge/CardStorageReader.java b/forge-core/src/main/java/forge/CardStorageReader.java index fecad8b17f4..cbf9dd08655 100644 --- a/forge-core/src/main/java/forge/CardStorageReader.java +++ b/forge-core/src/main/java/forge/CardStorageReader.java @@ -78,7 +78,6 @@ public class CardStorageReader { private final boolean useThreadPool = ThreadUtil.isMultiCoreSystem(); private final static int NUMBER_OF_PARTS = 25; - private final CountDownLatch cdl = new CountDownLatch(NUMBER_OF_PARTS); private final ProgressObserver progressObserver; private transient File cardsfolder; @@ -171,8 +170,13 @@ public class CardStorageReader { final List allFiles = collectCardFiles(new ArrayList(), this.cardsfolder); estimatedFilesRemaining = allFiles.size(); - List>> taskFiles = makeTaskListForFiles(allFiles, zip == null ? NUMBER_OF_PARTS : 1 + NUMBER_OF_PARTS / 5); + int fileParts = zip == null ? NUMBER_OF_PARTS : 1 + NUMBER_OF_PARTS / 3; + if( allFiles.size() < fileParts * 100) + fileParts = allFiles.size() / 100; // to avoid creation of many threads for a dozen of files + final CountDownLatch cdlFiles = new CountDownLatch(fileParts); + List>> taskFiles = makeTaskListForFiles(allFiles, cdlFiles); + final CountDownLatch cdlZip = new CountDownLatch(NUMBER_OF_PARTS); List>> taskZip = new ArrayList<>(); if( this.zip != null ) { estimatedFilesRemaining = this.zip.size(); @@ -187,7 +191,7 @@ public class CardStorageReader { entries.add(entry); } - taskZip = makeTaskListForZip(entries, NUMBER_OF_PARTS); + taskZip = makeTaskListForZip(entries, cdlZip); } Set result = new TreeSet(new Comparator() { @@ -202,7 +206,7 @@ public class CardStorageReader { progressObserver.report(0, taskFiles.size()); StopWatch sw = new StopWatch(); sw.start(); - executeLoadTask(result, taskFiles); + executeLoadTask(result, taskFiles, cdlFiles); sw.stop(); final long timeOnParse = sw.getTime(); System.out.printf("Read cards: %s files in %d ms (%d parts) %s%n", estimatedFilesRemaining, timeOnParse, taskFiles.size(), useThreadPool ? "using thread pool" : "in same thread"); @@ -213,7 +217,7 @@ public class CardStorageReader { progressObserver.report(0, taskZip.size()); StopWatch sw = new StopWatch(); sw.start(); - executeLoadTask(result, taskZip); + executeLoadTask(result, taskZip, cdlZip); sw.stop(); final long timeOnParse = sw.getTime(); System.out.printf("Read cards: %s archived files in %d ms (%d parts) %s%n", estimatedFilesRemaining, timeOnParse, taskZip.size(), useThreadPool ? "using thread pool" : "in same thread"); @@ -222,7 +226,7 @@ public class CardStorageReader { return result; } // loadCardsUntilYouFind(String) - private void executeLoadTask(Collection result, final List>> tasks) { + private void executeLoadTask(Collection result, final List>> tasks, CountDownLatch cdl) { try { if ( useThreadPool ) { final ExecutorService executor = ThreadUtil.getComputingPool(0.5f); @@ -246,8 +250,9 @@ public class CardStorageReader { } } - private List>> makeTaskListForZip(final List entries, final int maxParts) { + private List>> makeTaskListForZip(final List entries, final CountDownLatch cdl) { int totalFiles = entries.size(); + final int maxParts = (int) cdl.getCount(); int filesPerPart = totalFiles / maxParts; final List>> tasks = new ArrayList>>(); for (int iPart = 0; iPart < maxParts; iPart++) { @@ -266,8 +271,9 @@ public class CardStorageReader { return tasks; } - private List>> makeTaskListForFiles(final List allFiles, final int maxParts) { + private List>> makeTaskListForFiles(final List allFiles, final CountDownLatch cdl) { int totalFiles = allFiles.size(); + final int maxParts = (int) cdl.getCount(); int filesPerPart = totalFiles / maxParts; final List>> tasks = new ArrayList>>(); for (int iPart = 0; iPart < maxParts; iPart++) {