From f520d4b2c64b5a5c0e97d8fa4941edee06746a2c Mon Sep 17 00:00:00 2001 From: Nullkat Date: Wed, 7 Jul 2021 17:02:38 +0300 Subject: [PATCH] TaskManager bug fixes and code cleanup --- .../progressia/client/audio/AudioSystem.java | 13 +- .../progressia/common/modules/Module.java | 17 +- .../progressia/common/modules/Task.java | 26 +-- .../common/modules/TaskManager.java | 170 +++++++++--------- 4 files changed, 120 insertions(+), 106 deletions(-) diff --git a/src/main/java/ru/windcorp/progressia/client/audio/AudioSystem.java b/src/main/java/ru/windcorp/progressia/client/audio/AudioSystem.java index c85dcc3..db64833 100644 --- a/src/main/java/ru/windcorp/progressia/client/audio/AudioSystem.java +++ b/src/main/java/ru/windcorp/progressia/client/audio/AudioSystem.java @@ -15,9 +15,10 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - + package ru.windcorp.progressia.client.audio; +import org.apache.logging.log4j.LogManager; import ru.windcorp.progressia.common.modules.Module; import ru.windcorp.progressia.common.modules.Task; import ru.windcorp.progressia.common.modules.TaskManager; @@ -29,10 +30,12 @@ public class AudioSystem { AudioManager.initAL(); Thread shutdownHook = new Thread(AudioManager::closeAL, "AL Shutdown Hook"); Runtime.getRuntime().addShutdownHook(shutdownHook); - Task t = new Task("Task:InitializeAudio") { + + Task t = new Task("AudioSystem:Initialize") { @Override protected void perform() { loadAudioData(); + LogManager.getLogger().info("Audio data is loaded"); } }; audioModule.addTask(t); @@ -41,9 +44,9 @@ public class AudioSystem { static void loadAudioData() { AudioManager.loadSound( - ResourceManager.getResource("assets/sounds/block_destroy_clap.ogg"), - "Progressia:BlockDestroy", - AudioFormat.MONO + ResourceManager.getResource("assets/sounds/block_destroy_clap.ogg"), + "Progressia:BlockDestroy", + AudioFormat.MONO ); } } diff --git a/src/main/java/ru/windcorp/progressia/common/modules/Module.java b/src/main/java/ru/windcorp/progressia/common/modules/Module.java index d8f27c2..65a132d 100644 --- a/src/main/java/ru/windcorp/progressia/common/modules/Module.java +++ b/src/main/java/ru/windcorp/progressia/common/modules/Module.java @@ -1,34 +1,35 @@ package ru.windcorp.progressia.common.modules; +import ru.windcorp.progressia.common.util.namespaces.Namespaced; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import ru.windcorp.progressia.common.util.namespaces.Namespaced; - public class Module extends Namespaced { private final List tasks = new ArrayList<>(); private final Map meta = new HashMap<>(); private final boolean done = false; - - + + public Module(String id) { super(id); } - + public Map getMeta() { return meta; } - + public List getTasks() { return tasks; } + public void addTask(Task task) { tasks.add(task); } - + /** * @return false - not all tasks are done */ @@ -38,7 +39,7 @@ public class Module extends Namespaced { return false; } } - + return true; } } diff --git a/src/main/java/ru/windcorp/progressia/common/modules/Task.java b/src/main/java/ru/windcorp/progressia/common/modules/Task.java index fe2f747..c1e7d8c 100644 --- a/src/main/java/ru/windcorp/progressia/common/modules/Task.java +++ b/src/main/java/ru/windcorp/progressia/common/modules/Task.java @@ -5,15 +5,13 @@ import ru.windcorp.progressia.common.util.namespaces.Namespaced; import java.util.ArrayList; import java.util.List; -public abstract class Task - extends Namespaced - implements Runnable - { - +public abstract class Task + extends Namespaced + implements Runnable { + + List requiredTasks = new ArrayList<>(); private boolean isDone = false; private boolean isActive = false; - - List requiredTasks = new ArrayList<>(); protected Task(String id) { super(id); @@ -28,13 +26,15 @@ public abstract class Task // This method will be invoked by Run() protected abstract void perform(); - + public boolean isDone() { return isDone; } - public boolean isActive() { return isActive; } - + public boolean isActive() { + return isActive; + } + public boolean canRun() { if (this.isActive) return false; for (Task reqT : requiredTasks) { @@ -42,8 +42,12 @@ public abstract class Task } return true; } - + public List getRequiredTasks() { return requiredTasks; } + + public void addRequiredTask(Task task) { + requiredTasks.add(task); + } } diff --git a/src/main/java/ru/windcorp/progressia/common/modules/TaskManager.java b/src/main/java/ru/windcorp/progressia/common/modules/TaskManager.java index a08966c..f641a1c 100644 --- a/src/main/java/ru/windcorp/progressia/common/modules/TaskManager.java +++ b/src/main/java/ru/windcorp/progressia/common/modules/TaskManager.java @@ -1,101 +1,107 @@ package ru.windcorp.progressia.common.modules; -import ru.windcorp.progressia.common.state.StateFieldBuilder; + +import org.apache.logging.log4j.LogManager; +import ru.windcorp.progressia.common.util.crash.CrashReports; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import static java.util.concurrent.Executors.newFixedThreadPool; public class TaskManager { - private static final TaskManager instance = new TaskManager(); - private final List tasks = new ArrayList<>(); - private final List modules = new ArrayList<>(); - private boolean loadingDone; - private int activeThreadsCount; + private static final TaskManager instance = new TaskManager(); + private final List tasks = new ArrayList<>(); + private final List modules = new ArrayList<>(); + private final ExecutorService executorService; + private final AtomicBoolean loadingDone; + private final AtomicInteger activeThreadsCount; - private final ExecutorService executorService; + private TaskManager() { + loadingDone = new AtomicBoolean(false); + activeThreadsCount = new AtomicInteger(0); + executorService = newFixedThreadPool( + Runtime.getRuntime().availableProcessors(), Thread::new); + } - private TaskManager() { - loadingDone = false; - activeThreadsCount = 0; - executorService = newFixedThreadPool( - Runtime.getRuntime().availableProcessors(), Thread::new); - } - - public static TaskManager getInstance() { - return instance; - } + public static TaskManager getInstance() { + return instance; + } - public void registerModule(Module module) { - tasks.addAll(module.getTasks()); - modules.add(module); - } + public void registerModule(Module module) { + tasks.addAll(module.getTasks()); + modules.add(module); + } - public boolean isLoadingDone() { - return loadingDone; - } + public boolean isLoadingDone() { + return loadingDone.get(); + } - public void startLoading() { + public void startLoading() { + LogManager.getLogger().info("Loading is started"); + for (int i = 0; i < Runtime.getRuntime().availableProcessors(); i++) { + executorService.submit(() -> { + while (!loadingDone.get()) { + Task t = getRunnableTask(); + if (t != null) { + activeThreadsCount.incrementAndGet(); + t.run(); + activeThreadsCount.decrementAndGet(); + synchronized (this) { + notifyAll(); + } + } else if (activeThreadsCount.get() > 0) { + try { + synchronized (this) { + this.wait(); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } else { + loadingDone.set(true); + synchronized (this) { + notifyAll(); + } + } + } + }); + } - for(int i = 0; i < Runtime.getRuntime().availableProcessors(); i++) { - executorService.submit(() -> { - while(!loadingDone) { - Task t = getRunnableTask(); - if (t != null) { - synchronized (this) { - activeThreadsCount++; - } - t.run(); - synchronized (this) { - activeThreadsCount--; - notifyAll(); - } - } else if (activeThreadsCount > 0) { - try { - synchronized (this) { - this.wait(); - } - } catch (InterruptedException e) { - e.printStackTrace(); - } - } else { - synchronized (this) { - loadingDone = true; - } - } - } - }); - } + waitForLoadingEnd(); + if (!tasks.isEmpty()) { + throw CrashReports.crash(new Exception("Loading is failed"), ""); + } + LogManager.getLogger().info("Loading is finished"); + executorService.shutdownNow(); + } - waitForLoadingEnd(); - executorService.shutdownNow(); - } + public synchronized Task getRunnableTask() { + if (!tasks.isEmpty()) { + for (Task t : + tasks) { + if (t.canRun()) { + tasks.remove(t); + return t; + } + } + } + return null; + } - public synchronized Task getRunnableTask() { - if(!tasks.isEmpty()) { - for (Task t : - tasks) { - if(t.canRun()) { - tasks.remove(t); - return t; - } - } - } - return null; - } - - private void waitForLoadingEnd() { - synchronized (this) { - while(!loadingDone) { - try { - this.wait(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - } + private void waitForLoadingEnd() { + synchronized (this) { + while (!loadingDone.get()) { + try { + this.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } }