diff --git a/common/src/main/java/com/dfsek/terra/profiler/Profiler.java b/common/src/main/java/com/dfsek/terra/profiler/Profiler.java index d2f625c43..9d984fcf6 100644 --- a/common/src/main/java/com/dfsek/terra/profiler/Profiler.java +++ b/common/src/main/java/com/dfsek/terra/profiler/Profiler.java @@ -3,8 +3,6 @@ package com.dfsek.terra.profiler; import java.util.Map; public interface Profiler { - ProfilerImpl INSTANCE = new ProfilerImpl(); - void push(String frame); void pop(String frame); diff --git a/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java b/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java index 5e4998010..23f00d495 100644 --- a/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java +++ b/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java @@ -13,10 +13,12 @@ public class ProfilerImpl implements Profiler { private static final ThreadLocal>> TIMINGS = ThreadLocal.withInitial(HashMap::new); private final List>> accessibleThreadMaps = new ArrayList<>(); private volatile boolean running = false; + private static boolean instantiated = false; public ProfilerImpl() { - + if(instantiated) throw new IllegalStateException("Only one instance of Profiler may exist!"); + instantiated = true; } @Override @@ -64,16 +66,14 @@ public class ProfilerImpl implements Profiler { @Override public Map getTimings() { Map map = new HashMap<>(); - accessibleThreadMaps.forEach(smap -> { - smap.forEach((key, list) -> { - String[] keys = key.split("\\."); - Timings timings = map.computeIfAbsent(keys[0], id -> new Timings()); - for(int i = 1; i < keys.length; i++) { - timings = timings.getSubItem(keys[i]); - } - list.forEach(timings::addTime); - }); - }); + accessibleThreadMaps.forEach(smap -> smap.forEach((key, list) -> { + String[] keys = key.split("\\."); + Timings timings = map.computeIfAbsent(keys[0], id -> new Timings()); + for(int i = 1; i < keys.length; i++) { + timings = timings.getSubItem(keys[i]); + } + list.forEach(timings::addTime); + })); return map; } } diff --git a/common/src/test/java/profiler/ProfilerTest.java b/common/src/test/java/profiler/ProfilerTest.java index 813e08eae..b60ea32e5 100644 --- a/common/src/test/java/profiler/ProfilerTest.java +++ b/common/src/test/java/profiler/ProfilerTest.java @@ -1,11 +1,13 @@ package profiler; import com.dfsek.terra.profiler.Profiler; +import com.dfsek.terra.profiler.ProfilerImpl; public class ProfilerTest { + private static final Profiler PROFILER = new ProfilerImpl(); //@Test public static void main(String... a) throws InterruptedException { - Profiler.INSTANCE.start(); + PROFILER.start(); for(int i = 0; i < 1000; i++) { doThing(); } @@ -17,29 +19,29 @@ public class ProfilerTest { for(int i = 0; i < 100; i++) { doOtherThing(); } - Profiler.INSTANCE.stop(); - Profiler.INSTANCE.getTimings().forEach((id, timings) -> { + PROFILER.stop(); + PROFILER.getTimings().forEach((id, timings) -> { System.out.println(id + ": " + timings.toString()); }); } private static void doThing() throws InterruptedException { - Profiler.INSTANCE.push("thing"); + PROFILER.push("thing"); Thread.sleep(1); doOtherThing(); - Profiler.INSTANCE.pop("thing"); + PROFILER.pop("thing"); } private static void doOtherThing() throws InterruptedException { - Profiler.INSTANCE.push("thing2"); + PROFILER.push("thing2"); Thread.sleep(2); doThirdOtherThing(); - Profiler.INSTANCE.pop("thing2"); + PROFILER.pop("thing2"); } private static void doThirdOtherThing() throws InterruptedException { - Profiler.INSTANCE.push("thing3"); + PROFILER.push("thing3"); Thread.sleep(2); - Profiler.INSTANCE.pop("thing3"); + PROFILER.pop("thing3"); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index e1254e51e..e65a918fc 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -40,6 +40,8 @@ import com.dfsek.terra.config.PluginConfig; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.profiler.Profiler; +import com.dfsek.terra.profiler.ProfilerImpl; import com.dfsek.terra.registry.master.AddonRegistry; import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.world.TerraWorld; @@ -64,6 +66,8 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { private final Map worldMap = new HashMap<>(); private final Map worlds = new HashMap<>(); + private final Profiler profiler = new ProfilerImpl(); + private final ConfigRegistry registry = new ConfigRegistry(); private final CheckedRegistry checkedRegistry = new CheckedRegistry<>(registry); @@ -141,6 +145,11 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { Bukkit.getScheduler().runTask(this, task); } + @Override + public Profiler getProfiler() { + return profiler; + } + @Override public void onDisable() { BukkitChunkGeneratorWrapper.saveAll(); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 95b8f1fb5..6b7359713 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -46,6 +46,8 @@ import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.features.PopulatorFeature; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; +import com.dfsek.terra.profiler.Profiler; +import com.dfsek.terra.profiler.ProfilerImpl; import com.dfsek.terra.registry.exception.DuplicateEntryException; import com.dfsek.terra.registry.master.AddonRegistry; import com.dfsek.terra.registry.master.ConfigRegistry; @@ -105,6 +107,9 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private final Map worldMap = new HashMap<>(); private final EventManager eventManager = new TerraEventManager(this); private final GenericLoaders genericLoaders = new GenericLoaders(this); + + private final Profiler profiler = new ProfilerImpl(); + private final Logger logger = new Logger() { private final org.apache.logging.log4j.Logger logger = LogManager.getLogger(); @@ -389,6 +394,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { return eventManager; } + @Override + public Profiler getProfiler() { + return profiler; + } + @Addon("Terra-Fabric") @Author("Terra") @Version("1.0.0") diff --git a/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java b/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java index a1dd2e4c9..ff426a5c0 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java +++ b/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java @@ -21,6 +21,8 @@ import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.platform.RawBiome; import com.dfsek.terra.platform.RawWorldHandle; +import com.dfsek.terra.profiler.Profiler; +import com.dfsek.terra.profiler.ProfilerImpl; import com.dfsek.terra.registry.master.AddonRegistry; import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.world.TerraWorld; @@ -39,6 +41,8 @@ public class StandalonePlugin implements TerraPlugin { private final RawWorldHandle worldHandle = new RawWorldHandle(); private final EventManager eventManager = new TerraEventManager(this); + private final Profiler profiler = new ProfilerImpl(); + @Override public WorldHandle getWorldHandle() { return worldHandle; @@ -147,4 +151,9 @@ public class StandalonePlugin implements TerraPlugin { public EventManager getEventManager() { return eventManager; } + + @Override + public Profiler getProfiler() { + return profiler; + } } diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java index 78baf45d5..536850875 100644 --- a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java @@ -14,6 +14,7 @@ import com.dfsek.terra.api.util.logging.DebugLogger; import com.dfsek.terra.config.PluginConfig; import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.registry.master.AddonRegistry; import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.sponge.world.SpongeWorldHandle; @@ -138,4 +139,9 @@ public class TerraSpongePlugin implements TerraPlugin { public EventManager getEventManager() { return eventManager; } + + @Override + public Profiler getProfiler() { + return null; + } }