diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index 76c6fd91e..1cbfa74f9 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -95,6 +95,8 @@ public class Iris extends VolmitPlugin implements Listener { private void preEnable() { instance = this; + services = new KMap<>(); + initialize("com.volmit.iris.core.service").forEach((i) -> services.put((Class) i.getClass(), (IrisService) i)); INMS.get(); IO.delete(new File("iris")); installDataPacks(); @@ -103,9 +105,6 @@ public class Iris extends VolmitPlugin implements Listener { @SuppressWarnings("unchecked") private void enable() { - services = new KMap<>(); - initialize("com.volmit.iris.core.service").forEach((i) -> services.put((Class) i.getClass(), (IrisService) i)); - audiences = BukkitAudiences.create(this); sender = new VolmitSender(Bukkit.getConsoleSender()); sender.setTag(getTag()); @@ -245,7 +244,7 @@ public class Iris extends VolmitPlugin implements Listener { for (File i : packs.listFiles()) { if (i.isDirectory()) { Iris.verbose("Checking Pack: " + i.getPath()); - IrisData data = new IrisData(i); + IrisData data = IrisData.get(i); File dims = new File(i, "dimensions"); if (dims.exists()) { @@ -339,7 +338,7 @@ public class Iris extends VolmitPlugin implements Listener { for (File i : packs.listFiles()) { if (i.isDirectory()) { Iris.verbose("Checking Pack: " + i.getPath()); - IrisData data = new IrisData(i); + IrisData data = IrisData.get(i); File dims = new File(i, "dimensions"); if (dims.exists()) { @@ -376,7 +375,7 @@ public class Iris extends VolmitPlugin implements Listener { } public boolean verifyDataPackInstalled(IrisDimension dimension) { - IrisData idm = new IrisData(getDataFolder("packs", dimension.getLoadKey())); + IrisData idm = IrisData.get(getDataFolder("packs", dimension.getLoadKey())); KSet keys = new KSet<>(); boolean warn = false; diff --git a/src/main/java/com/volmit/iris/core/IrisSettings.java b/src/main/java/com/volmit/iris/core/IrisSettings.java index 9d8de9366..4a87206e7 100644 --- a/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -122,7 +122,6 @@ public class IrisSettings { @Data public static class IrisSettingsGenerator { - public String defaultWorldType = "overworld"; public boolean disableMCA = false; public boolean systemEffects = true; diff --git a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioProfile.java b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioProfile.java index 609ecf599..3cea777b1 100644 --- a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioProfile.java +++ b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioProfile.java @@ -87,7 +87,7 @@ public class CommandIrisStudioProfile extends MortarCommand { } IrisProject p = new IrisProject(f); - IrisData data = new IrisData(f); + IrisData data = IrisData.get(f); KMap styleTimings = new KMap<>(); KMap interpolatorTimings = new KMap<>(); KMap generatorTimings = new KMap<>(); diff --git a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioUpdate.java b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioUpdate.java index e8cfb22e9..f705d75e8 100644 --- a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioUpdate.java +++ b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioUpdate.java @@ -63,7 +63,7 @@ public class CommandIrisStudioUpdate extends MortarCommand { for (String i : args) { if (i.equals("--rewrite-objects")) { - IrisData data = new IrisData(Iris.service(StudioSVC.class).getWorkspaceFolder(args[0])); + IrisData data = IrisData.get(Iris.service(StudioSVC.class).getWorkspaceFolder(args[0])); int t = data.getObjectLoader().getPossibleKeys().length; ChronoLatch cl = new ChronoLatch(250, false); MultiBurst bx = new MultiBurst("Object Rewriter", Thread.MIN_PRIORITY, Runtime.getRuntime().availableProcessors()); diff --git a/src/main/java/com/volmit/iris/core/decrees/DecStudio.java b/src/main/java/com/volmit/iris/core/decrees/DecStudio.java index d8f4175b3..7a243f2aa 100644 --- a/src/main/java/com/volmit/iris/core/decrees/DecStudio.java +++ b/src/main/java/com/volmit/iris/core/decrees/DecStudio.java @@ -206,7 +206,7 @@ public class DecStudio implements DecreeExecutor { } }; - IrisData data = new IrisData(Iris.service(StudioSVC.class).getWorkspaceFolder(project.getLoadKey())); + IrisData data = IrisData.get(Iris.service(StudioSVC.class).getWorkspaceFolder(project.getLoadKey())); for (String f : data.getObjectLoader().getPossibleKeys()) { CompletableFuture gg = burst.complete(() -> { File ff = data.getObjectLoader().findFile(f); @@ -437,7 +437,7 @@ public class DecStudio implements DecreeExecutor { File pack = dimension.getLoadFile().getParentFile().getParentFile(); File report = Iris.instance.getDataFile("profile.txt"); IrisProject project = new IrisProject(pack); - IrisData data = new IrisData(pack); + IrisData data = IrisData.get(pack); KList fileText = new KList<>(); diff --git a/src/main/java/com/volmit/iris/core/project/IrisProject.java b/src/main/java/com/volmit/iris/core/project/IrisProject.java index 3a8cd8535..bc4564a3b 100644 --- a/src/main/java/com/volmit/iris/core/project/IrisProject.java +++ b/src/main/java/com/volmit/iris/core/project/IrisProject.java @@ -249,7 +249,7 @@ public class IrisProject { settings.put("[json]", jc); settings.put("json.maxItemsComputed", 30000); JSONArray schemas = new JSONArray(); - IrisData dm = new IrisData(getPath()); + IrisData dm = IrisData.get(getPath()); for (ResourceLoader r : dm.getLoaders().v()) { if (r.supportsSchemas()) { @@ -265,7 +265,7 @@ public class IrisProject { public File compilePackage(VolmitSender sender, boolean obfuscate, boolean minify) { String dimm = getName(); - IrisData dm = new IrisData(path); + IrisData dm = IrisData.get(path); IrisDimension dimension = dm.getDimensionLoader().load(dimm); File folder = new File(Iris.instance.getDataFolder(), "exports/" + dimension.getLoadKey()); folder.mkdirs(); diff --git a/src/main/java/com/volmit/iris/core/project/loader/IrisData.java b/src/main/java/com/volmit/iris/core/project/loader/IrisData.java index e56fdc42d..28c36af52 100644 --- a/src/main/java/com/volmit/iris/core/project/loader/IrisData.java +++ b/src/main/java/com/volmit/iris/core/project/loader/IrisData.java @@ -47,6 +47,7 @@ import java.util.function.Function; @Data public class IrisData { + private static final KMap dataLoaders = new KMap<>(); private ResourceLoader biomeLoader; private ResourceLoader lootLoader; private ResourceLoader regionLoader; @@ -68,11 +69,12 @@ public class IrisData { private Engine engine; private final int id; - public IrisData(File dataFolder) { - this(dataFolder, false); + public static IrisData get(File dataFolder) + { + return dataLoaders.compute(dataFolder, (k,v) -> v == null ? new IrisData(dataFolder) : v); } - public IrisData(File dataFolder, boolean oneshot) { + private IrisData(File dataFolder) { this.engine = null; this.dataFolder = dataFolder; this.id = RNG.r.imax(); @@ -80,6 +82,19 @@ public class IrisData { hotloaded(); } + public static int cacheSize() { + int m = 0; + for(IrisData i : dataLoaders.values()) + { + for(ResourceLoader j : i.getLoaders().values()) + { + m+=j.getLoadCache().size(); + } + } + + return m; + } + public void preprocessObject(IrisRegistrant t) { try { IrisContext ctx = IrisContext.get(); @@ -125,7 +140,7 @@ public class IrisData { } public IrisData copy() { - return new IrisData(dataFolder); + return IrisData.get(dataFolder); } private ResourceLoader registerLoader(Class registrant) { @@ -260,7 +275,7 @@ public class IrisData { try { for (File i : Objects.requireNonNull(Iris.instance.getDataFolder("packs").listFiles())) { if (i.isDirectory()) { - IrisData dm = new IrisData(i, true); + IrisData dm = get(i); T t = v.apply(dm); if (t != null) { diff --git a/src/main/java/com/volmit/iris/core/project/loader/ResourceLoader.java b/src/main/java/com/volmit/iris/core/project/loader/ResourceLoader.java index aa409c74d..de0f17c77 100644 --- a/src/main/java/com/volmit/iris/core/project/loader/ResourceLoader.java +++ b/src/main/java/com/volmit/iris/core/project/loader/ResourceLoader.java @@ -45,10 +45,10 @@ import java.util.stream.Stream; @Data public class ResourceLoader { public static final AtomicDouble tlt = new AtomicDouble(0); + private static final int CACHE_SIZE = 100000; protected File root; protected String folderName; protected String resourceTypeName; - protected KMap folderMapCache; protected KMap loadCache; protected KList folderCache; protected Class objectClass; @@ -64,7 +64,6 @@ public class ResourceLoader { this.manager = manager; sec = new ChronoLatch(5000); loads = new AtomicInteger(); - folderMapCache = new KMap<>(); this.objectClass = objectClass; cname = objectClass.getCanonicalName(); this.resourceTypeName = resourceTypeName; diff --git a/src/main/java/com/volmit/iris/core/service/BoardSVC.java b/src/main/java/com/volmit/iris/core/service/BoardSVC.java index 4206f6266..192d86753 100644 --- a/src/main/java/com/volmit/iris/core/service/BoardSVC.java +++ b/src/main/java/com/volmit/iris/core/service/BoardSVC.java @@ -19,6 +19,7 @@ package com.volmit.iris.core.service; import com.volmit.iris.Iris; +import com.volmit.iris.core.project.loader.IrisData; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.feature.IrisFeaturePositional; @@ -142,7 +143,7 @@ public class BoardSVC implements IrisService, BoardProvider { v.add(C.AQUA + "Height" + C.GRAY + ": " + Math.round(engine.getHeight(x, z))); v.add(C.AQUA + "Slope" + C.GRAY + ": " + Form.f(engine.getComplex().getSlopeStream().get(x, z), 2)); v.add(C.AQUA + "Features" + C.GRAY + ": " + Form.f(f.size())); - v.add(C.AQUA + "Energy" + C.GRAY + ": " + Form.f(engine.getWorldManager().getEnergy(), 0)); + v.add(C.AQUA + "Cache" + C.GRAY + ": " + Form.f(IrisData.cacheSize())); v.add(C.AQUA + "Sat" + C.GRAY + ": " + Form.f(engine.getWorldManager().getEntityCount()) + "e / " + Form.f(engine.getWorldManager().getChunkCount()) + "c (" + Form.pc(engine.getWorldManager().getEntitySaturation(), 0) + ")"); } diff --git a/src/main/java/com/volmit/iris/core/service/ExecutionSVC.java b/src/main/java/com/volmit/iris/core/service/ExecutionSVC.java new file mode 100644 index 000000000..b9f369583 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/service/ExecutionSVC.java @@ -0,0 +1,101 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2021 Arcane Arts (Volmit Software) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.volmit.iris.core.service; + +import com.volmit.iris.Iris; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.parallel.MultiBurst; +import com.volmit.iris.util.plugin.IrisService; + +import java.util.concurrent.ExecutorService; + +public class ExecutionSVC implements IrisService +{ + private KList threads = new KList<>(); + private KList bursts = new KList<>(); + private KList services = new KList<>(); + + public void register(Thread t) + { + threads.add(t); + } + + public void register(MultiBurst burst) + { + bursts.add(burst); + } + + public void register(ExecutorService service) + { + services.add(service); + } + + @Override + public void onEnable() { + + } + + @Override + public void onDisable() { + for(Thread i : threads) + { + if(i.isAlive()) + { + try + { + i.interrupt(); + Iris.info("Shutdown Thread " + i.getName()); + } + + catch(Throwable e) + { + + } + } + } + + for(MultiBurst i : bursts) + { + try + { + i.shutdownNow(); + Iris.info("Shutdown Multiburst " + i); + } + + catch(Throwable e) + { + + } + } + + for(ExecutorService i : services) + { + try + { + i.shutdownNow(); + Iris.info("Shutdown Executor Service " + i); + } + + catch(Throwable e) + { + + } + } + } +} diff --git a/src/main/java/com/volmit/iris/core/service/StudioSVC.java b/src/main/java/com/volmit/iris/core/service/StudioSVC.java index d47de46b1..063891ccb 100644 --- a/src/main/java/com/volmit/iris/core/service/StudioSVC.java +++ b/src/main/java/com/volmit/iris/core/service/StudioSVC.java @@ -78,6 +78,7 @@ public class StudioSVC implements IrisService { for (World i : Bukkit.getWorlds()) { if (IrisToolbelt.isIrisWorld(i)) { + IrisToolbelt.evacuate(i); Iris.debug("Closing Platform Generator " + i.getName()); IrisToolbelt.access(i).close(); } @@ -142,7 +143,7 @@ public class StudioSVC implements IrisService { return null; } - IrisData dm = new IrisData(irispack); + IrisData dm = IrisData.get(irispack); dim = dm.getDimensionLoader().load(type); if (dim == null) { diff --git a/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java b/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java index 39ff711b5..530dbde40 100644 --- a/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java +++ b/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java @@ -64,7 +64,7 @@ public class IrisToolbelt { return null; } - return new IrisData(pack).getDimensionLoader().load(dimension); + return IrisData.get(pack).getDimensionLoader().load(dimension); } /** diff --git a/src/main/java/com/volmit/iris/engine/IrisEngine.java b/src/main/java/com/volmit/iris/engine/IrisEngine.java index fd062e5e2..5cc9c5067 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -431,7 +431,7 @@ public class IrisEngine extends BlockPopulator implements Engine { catch(Throwable e) { - e.printStackTrace(); + Iris.reportError(e); } } diff --git a/src/main/java/com/volmit/iris/engine/platform/EngineProvider.java b/src/main/java/com/volmit/iris/engine/platform/EngineProvider.java index 401694e34..f4c7ad035 100644 --- a/src/main/java/com/volmit/iris/engine/platform/EngineProvider.java +++ b/src/main/java/com/volmit/iris/engine/platform/EngineProvider.java @@ -40,7 +40,7 @@ public class EngineProvider { public void provideEngine(IrisWorld world, String dimension, File dataLocation, boolean studio, Consumer post) { close(); engine.set(MultiBurst.burst.completeValue(() -> { - IrisData data = new IrisData(dataLocation); + IrisData data = IrisData.get(dataLocation); IrisDimension realDimension = data.getDimensionLoader().load(dimension); if (realDimension == null) { diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/BiomeHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/BiomeHandler.java index deb687b79..5f6c9ec42 100644 --- a/src/main/java/com/volmit/iris/util/decree/handlers/BiomeHandler.java +++ b/src/main/java/com/volmit/iris/util/decree/handlers/BiomeHandler.java @@ -37,7 +37,7 @@ public class BiomeHandler implements DecreeParameterHandler { //noinspection ConstantConditions for (File i : Iris.instance.getDataFolder("packs").listFiles()) { if (i.isDirectory()) { - IrisData data = new IrisData(i, true); + IrisData data = IrisData.get(i); for (IrisBiome j : data.getBiomeLoader().loadAll(data.getBiomeLoader().getPossibleKeys())) { p.putIfAbsent(j.getLoadKey(), j); } diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/DimensionHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/DimensionHandler.java index b22f6b073..3e4f43fbd 100644 --- a/src/main/java/com/volmit/iris/util/decree/handlers/DimensionHandler.java +++ b/src/main/java/com/volmit/iris/util/decree/handlers/DimensionHandler.java @@ -37,7 +37,7 @@ public class DimensionHandler implements DecreeParameterHandler { //noinspection ConstantConditions for (File i : Iris.instance.getDataFolder("packs").listFiles()) { if (i.isDirectory()) { - IrisData data = new IrisData(i, true); + IrisData data = IrisData.get(i); for (IrisDimension j : data.getDimensionLoader().loadAll(data.getDimensionLoader().getPossibleKeys())) { p.putIfAbsent(j.getLoadKey(), j); } diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/EntityHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/EntityHandler.java index f3c5b43f2..ab364b18e 100644 --- a/src/main/java/com/volmit/iris/util/decree/handlers/EntityHandler.java +++ b/src/main/java/com/volmit/iris/util/decree/handlers/EntityHandler.java @@ -43,7 +43,7 @@ public class EntityHandler implements DecreeParameterHandler { //noinspection ConstantConditions for (File i : Iris.instance.getDataFolder("packs").listFiles()) { if (i.isDirectory()) { - IrisData data = new IrisData(i, true); + IrisData data = IrisData.get(i); for (IrisEntity j : data.getEntityLoader().loadAll(data.getEntityLoader().getPossibleKeys())) { p.putIfAbsent(j.getLoadKey(), j); } diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/GeneratorHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/GeneratorHandler.java index 108b39f89..c31390629 100644 --- a/src/main/java/com/volmit/iris/util/decree/handlers/GeneratorHandler.java +++ b/src/main/java/com/volmit/iris/util/decree/handlers/GeneratorHandler.java @@ -37,7 +37,7 @@ public class GeneratorHandler implements DecreeParameterHandler { //noinspection ConstantConditions for (File i : Iris.instance.getDataFolder("packs").listFiles()) { if (i.isDirectory()) { - IrisData data = new IrisData(i, true); + IrisData data = IrisData.get(i); for (IrisGenerator j : data.getGeneratorLoader().loadAll(data.getGeneratorLoader().getPossibleKeys())) { p.putIfAbsent(j.getLoadKey(), j); } diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/RegionHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/RegionHandler.java index d2ba36ddc..12d6064c3 100644 --- a/src/main/java/com/volmit/iris/util/decree/handlers/RegionHandler.java +++ b/src/main/java/com/volmit/iris/util/decree/handlers/RegionHandler.java @@ -37,7 +37,7 @@ public class RegionHandler implements DecreeParameterHandler { //noinspection ConstantConditions for (File i : Iris.instance.getDataFolder("packs").listFiles()) { if (i.isDirectory()) { - IrisData data = new IrisData(i, true); + IrisData data = IrisData.get(i); for (IrisRegion j : data.getRegionLoader().loadAll(data.getRegionLoader().getPossibleKeys())) { p.putIfAbsent(j.getLoadKey(), j); } diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/ScriptHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/ScriptHandler.java index 1f3bfc615..3120a7aa0 100644 --- a/src/main/java/com/volmit/iris/util/decree/handlers/ScriptHandler.java +++ b/src/main/java/com/volmit/iris/util/decree/handlers/ScriptHandler.java @@ -37,7 +37,7 @@ public class ScriptHandler implements DecreeParameterHandler { //noinspection ConstantConditions for (File i : Iris.instance.getDataFolder("packs").listFiles()) { if (i.isDirectory()) { - IrisData data = new IrisData(i, true); + IrisData data = IrisData.get(i); for (IrisScript j : data.getScriptLoader().loadAll(data.getScriptLoader().getPossibleKeys())) { p.putIfAbsent(j.getLoadKey(), j); } diff --git a/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java b/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java index 043835e1b..03d677a8f 100644 --- a/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java +++ b/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java @@ -20,6 +20,7 @@ package com.volmit.iris.util.parallel; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.core.service.ExecutionSVC; import com.volmit.iris.util.io.InstanceState; import com.volmit.iris.util.math.M; import com.volmit.iris.util.scheduling.J; @@ -70,6 +71,7 @@ public class MultiBurst { }; heartbeat.setName(name + " Monitor"); heartbeat.start(); + Iris.service(ExecutionSVC.class).register(this); } private synchronized ExecutorService getService() { @@ -88,6 +90,7 @@ public class MultiBurst { return t; }); + Iris.service(ExecutionSVC.class).register(service); Iris.debug("Started MultiBurst Pool " + name + " with " + tc + " threads at " + priority + " priority."); } diff --git a/src/main/java/com/volmit/iris/util/scheduling/Looper.java b/src/main/java/com/volmit/iris/util/scheduling/Looper.java index e243c7282..6ae2822e0 100644 --- a/src/main/java/com/volmit/iris/util/scheduling/Looper.java +++ b/src/main/java/com/volmit/iris/util/scheduling/Looper.java @@ -19,10 +19,14 @@ package com.volmit.iris.util.scheduling; import com.volmit.iris.Iris; +import com.volmit.iris.core.service.ExecutionSVC; + +import java.util.concurrent.ExecutorService; public abstract class Looper extends Thread { @SuppressWarnings("BusyWait") public void run() { + Iris.service(ExecutionSVC.class).register(this); while (!interrupted()) { try { long m = loop();