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 db64833..1747134 100644 --- a/src/main/java/ru/windcorp/progressia/client/audio/AudioSystem.java +++ b/src/main/java/ru/windcorp/progressia/client/audio/AudioSystem.java @@ -31,14 +31,13 @@ public class AudioSystem { Thread shutdownHook = new Thread(AudioManager::closeAL, "AL Shutdown Hook"); Runtime.getRuntime().addShutdownHook(shutdownHook); - Task t = new Task("AudioSystem:Initialize") { + Task t = new Task("AudioSystem:Initialize", audioModule) { @Override protected void perform() { loadAudioData(); LogManager.getLogger().info("Audio data is loaded"); } }; - audioModule.addTask(t); TaskManager.getInstance().registerModule(audioModule); } 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 65a132d..5e81be6 100644 --- a/src/main/java/ru/windcorp/progressia/common/modules/Module.java +++ b/src/main/java/ru/windcorp/progressia/common/modules/Module.java @@ -2,16 +2,13 @@ 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 java.util.*; public class Module extends Namespaced { private final List tasks = new ArrayList<>(); private final Map meta = new HashMap<>(); - private final boolean done = false; + private final Map unmodifiableMeta = Collections.unmodifiableMap(meta); public Module(String id) { @@ -19,7 +16,7 @@ public class Module extends Namespaced { } public Map getMeta() { - return meta; + return unmodifiableMeta; } public List getTasks() { @@ -27,19 +24,8 @@ public class Module extends Namespaced { } public void addTask(Task task) { + task.setOwner(this); tasks.add(task); } - /** - * @return false - not all tasks are done - */ - public boolean done() { - for (Task t : tasks) { - if (!t.isDone()) { - 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 c1e7d8c..d0663b0 100644 --- a/src/main/java/ru/windcorp/progressia/common/modules/Task.java +++ b/src/main/java/ru/windcorp/progressia/common/modules/Task.java @@ -1,5 +1,6 @@ package ru.windcorp.progressia.common.modules; +import ru.windcorp.progressia.common.util.crash.CrashReports; import ru.windcorp.progressia.common.util.namespaces.Namespaced; import java.util.ArrayList; @@ -12,11 +13,17 @@ public abstract class Task List requiredTasks = new ArrayList<>(); private boolean isDone = false; private boolean isActive = false; + private Module owner; - protected Task(String id) { + public Task(String id) { super(id); } + public Task(String id, Module module) { + this(id); + module.addTask(this); + } + @Override public void run() { isActive = true; @@ -50,4 +57,19 @@ public abstract class Task public void addRequiredTask(Task task) { requiredTasks.add(task); } + + public void setOwner(Module module) { + if(owner != null) { + CrashReports.crash( + new Exception("Owner is not null") + , "Could not set %s as owner of %s, because %s is already owner of it.", + module.getId(), this.getId(), this.getOwner().getId()); + } else { + owner = module; + } + } + + public Module getOwner() { + return owner; + } } 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 f641a1c..bea9abc 100644 --- a/src/main/java/ru/windcorp/progressia/common/modules/TaskManager.java +++ b/src/main/java/ru/windcorp/progressia/common/modules/TaskManager.java @@ -1,11 +1,9 @@ package ru.windcorp.progressia.common.modules; - 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.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -14,17 +12,24 @@ 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 final Set tasks = new HashSet<>(); + private final Set modules = new HashSet<>(); private final ExecutorService executorService; + private final AtomicBoolean loadingDone; private final AtomicInteger activeThreadsCount; + private final Map loadersMonitorMap; + Map unmodifiableLoadersMonitorMap; + private TaskManager() { loadingDone = new AtomicBoolean(false); activeThreadsCount = new AtomicInteger(0); executorService = newFixedThreadPool( Runtime.getRuntime().availableProcessors(), Thread::new); + loadersMonitorMap = new HashMap<>(Runtime.getRuntime().availableProcessors()); + unmodifiableLoadersMonitorMap = Collections.unmodifiableMap(loadersMonitorMap); } public static TaskManager getInstance() { @@ -48,7 +53,9 @@ public class TaskManager { Task t = getRunnableTask(); if (t != null) { activeThreadsCount.incrementAndGet(); + loadersMonitorMap.put(Thread.currentThread(), t); t.run(); + loadersMonitorMap.put(Thread.currentThread(), null); activeThreadsCount.decrementAndGet(); synchronized (this) { notifyAll(); @@ -104,4 +111,8 @@ public class TaskManager { } } + public Map getLoadersMonitorMap() { + return unmodifiableLoadersMonitorMap; + } + }