diff --git a/core/src/main/java/com/volmit/iris/core/IrisSettings.java b/core/src/main/java/com/volmit/iris/core/IrisSettings.java index 52348a3fe..48161dadf 100644 --- a/core/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/core/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -24,7 +24,6 @@ import com.volmit.iris.util.io.IO; import com.volmit.iris.util.json.JSONException; import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.plugin.VolmitSender; -import com.volmit.iris.util.scheduling.ChronoLatch; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -45,6 +44,7 @@ public class IrisSettings { private IrisSettingsStudio studio = new IrisSettingsStudio(); private IrisSettingsPerformance performance = new IrisSettingsPerformance(); private IrisSettingsUpdater updater = new IrisSettingsUpdater(); + private IrisSettingsPregen pregen = new IrisSettingsPregen(); public static int getThreadCount(int c) { return switch (c) { @@ -135,7 +135,12 @@ public class IrisSettings { @Data public static class IrisSettingsConcurrency { public int parallelism = -1; + } + + @Data + public static class IrisSettingsPregen { public boolean useVirtualThreads = false; + public int maxConcurrency = 256; } @Data diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java index 9b4203490..df491da5f 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java @@ -36,6 +36,7 @@ import com.volmit.iris.util.format.Form; import com.volmit.iris.util.io.CountingDataInputStream; import com.volmit.iris.util.io.IO; import com.volmit.iris.util.mantle.TectonicPlate; +import com.volmit.iris.util.math.M; import com.volmit.iris.util.nbt.mca.MCAFile; import com.volmit.iris.util.nbt.mca.MCAUtil; import com.volmit.iris.util.parallel.MultiBurst; @@ -115,6 +116,42 @@ public class CommandDeveloper implements DecreeExecutor { Iris.info("-------------------------"); } + @Decree(description = "Test") + public void dumpThreads() { + try { + File fi = Iris.instance.getDataFile("dump", "td-" + new java.sql.Date(M.ms()) + ".txt"); + FileOutputStream fos = new FileOutputStream(fi); + Map f = Thread.getAllStackTraces(); + PrintWriter pw = new PrintWriter(fos); + + pw.println(Thread.activeCount() + "/" + f.size()); + var run = Runtime.getRuntime(); + pw.println("Memory:"); + pw.println("\tMax: " + run.maxMemory()); + pw.println("\tTotal: " + run.totalMemory()); + pw.println("\tFree: " + run.freeMemory()); + pw.println("\tUsed: " + (run.totalMemory() - run.freeMemory())); + + for (Thread i : f.keySet()) { + pw.println("========================================"); + pw.println("Thread: '" + i.getName() + "' ID: " + i.getId() + " STATUS: " + i.getState().name()); + + for (StackTraceElement j : f.get(i)) { + pw.println(" @ " + j.toString()); + } + + pw.println("========================================"); + pw.println(); + pw.println(); + } + + pw.close(); + Iris.info("DUMPED! See " + fi.getAbsolutePath()); + } catch (Throwable e) { + e.printStackTrace(); + } + } + @Decree(description = "Test") public void benchmarkMantle( @Param(description = "The world to bench", aliases = {"world"}) diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java b/core/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java index a54e457d0..1283cda30 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java @@ -50,10 +50,10 @@ public class AsyncPregenMethod implements PregeneratorMethod { } this.world = world; - service = IrisSettings.get().getConcurrency().isUseVirtualThreads() ? + service = IrisSettings.get().getPregen().isUseVirtualThreads() ? Executors.newVirtualThreadPerTaskExecutor() : new MultiBurst("Iris Async Pregen", Thread.MIN_PRIORITY); - semaphore = new Semaphore(256); + semaphore = new Semaphore(IrisSettings.get().getPregen().getMaxConcurrency()); this.lastUse = new KMap<>(); } diff --git a/core/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java b/core/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java index 6fbea21cd..c23aee9d3 100644 --- a/core/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java +++ b/core/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java @@ -181,42 +181,42 @@ public class MultiBurst implements ExecutorService { @NotNull @Override public Future submit(@NotNull Callable task) { - return service.submit(task); + return getService().submit(task); } @NotNull @Override public Future submit(@NotNull Runnable task, T result) { - return service.submit(task, result); + return getService().submit(task, result); } @NotNull @Override public Future submit(@NotNull Runnable task) { - return service.submit(task); + return getService().submit(task); } @NotNull @Override public List> invokeAll(@NotNull Collection> tasks) throws InterruptedException { - return service.invokeAll(tasks); + return getService().invokeAll(tasks); } @NotNull @Override public List> invokeAll(@NotNull Collection> tasks, long timeout, @NotNull TimeUnit unit) throws InterruptedException { - return service.invokeAll(tasks, timeout, unit); + return getService().invokeAll(tasks, timeout, unit); } @NotNull @Override public T invokeAny(@NotNull Collection> tasks) throws InterruptedException, ExecutionException { - return service.invokeAny(tasks); + return getService().invokeAny(tasks); } @Override public T invokeAny(@NotNull Collection> tasks, long timeout, @NotNull TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { - return service.invokeAny(tasks, timeout, unit); + return getService().invokeAny(tasks, timeout, unit); } public void close() {