From 703a1578ac26c7e73725b2584ac989abfc56cf37 Mon Sep 17 00:00:00 2001 From: Luck Date: Thu, 23 Dec 2021 12:42:21 +0000 Subject: Tidy up mod lifecycle --- .../java/me/lucko/spark/fabric/FabricSparkMod.java | 32 ++++++++++++- .../placeholder/SparkFabricPlaceholderApi.java | 2 + .../fabric/plugin/FabricClientSparkPlugin.java | 27 +++++++---- .../fabric/plugin/FabricServerSparkPlugin.java | 41 ++++++++-------- .../java/me/lucko/spark/forge/ForgeSparkMod.java | 12 ++--- .../spark/forge/plugin/ForgeClientSparkPlugin.java | 17 ++++--- .../spark/forge/plugin/ForgeServerSparkPlugin.java | 54 +++++++++++++++------- 7 files changed, 125 insertions(+), 60 deletions(-) diff --git a/spark-fabric/src/main/java/me/lucko/spark/fabric/FabricSparkMod.java b/spark-fabric/src/main/java/me/lucko/spark/fabric/FabricSparkMod.java index 1dd4fd8..fdb359e 100644 --- a/spark-fabric/src/main/java/me/lucko/spark/fabric/FabricSparkMod.java +++ b/spark-fabric/src/main/java/me/lucko/spark/fabric/FabricSparkMod.java @@ -20,14 +20,19 @@ package me.lucko.spark.fabric; +import com.mojang.brigadier.CommandDispatcher; + import me.lucko.spark.fabric.plugin.FabricClientSparkPlugin; import me.lucko.spark.fabric.plugin.FabricServerSparkPlugin; import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.minecraft.client.MinecraftClient; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.command.ServerCommandSource; import java.nio.file.Path; import java.util.Objects; @@ -38,6 +43,8 @@ public class FabricSparkMod implements ModInitializer { private ModContainer container; private Path configDirectory; + private FabricServerSparkPlugin activeServerPlugin = null; + @Override public void onInitialize() { FabricSparkMod.mod = this; @@ -47,8 +54,12 @@ public class FabricSparkMod implements ModInitializer { .orElseThrow(() -> new IllegalStateException("Unable to get container for spark")); this.configDirectory = loader.getConfigDir().resolve("spark"); - // load hooks - ServerLifecycleEvents.SERVER_STARTING.register(server -> FabricServerSparkPlugin.register(this, server)); + // lifecycle hooks + ServerLifecycleEvents.SERVER_STARTING.register(this::initializeServer); + ServerLifecycleEvents.SERVER_STOPPING.register(this::onServerStopping); + + // events to propagate to active server plugin + CommandRegistrationCallback.EVENT.register(this::onCommandRegister); } // called be entrypoint defined in fabric.mod.json @@ -57,6 +68,23 @@ public class FabricSparkMod implements ModInitializer { FabricClientSparkPlugin.register(FabricSparkMod.mod, MinecraftClient.getInstance()); } + public void initializeServer(MinecraftServer server) { + this.activeServerPlugin = FabricServerSparkPlugin.register(this, server); + } + + public void onServerStopping(MinecraftServer stoppingServer) { + if (this.activeServerPlugin != null) { + this.activeServerPlugin.disable(); + this.activeServerPlugin = null; + } + } + + public void onCommandRegister(CommandDispatcher dispatcher, boolean isDedicated) { + if (this.activeServerPlugin != null) { + this.activeServerPlugin.registerCommands(dispatcher); + } + } + public String getVersion() { return this.container.getMetadata().getVersion().getFriendlyString(); } diff --git a/spark-fabric/src/main/java/me/lucko/spark/fabric/placeholder/SparkFabricPlaceholderApi.java b/spark-fabric/src/main/java/me/lucko/spark/fabric/placeholder/SparkFabricPlaceholderApi.java index 359630d..9171cbb 100644 --- a/spark-fabric/src/main/java/me/lucko/spark/fabric/placeholder/SparkFabricPlaceholderApi.java +++ b/spark-fabric/src/main/java/me/lucko/spark/fabric/placeholder/SparkFabricPlaceholderApi.java @@ -2,11 +2,13 @@ package me.lucko.spark.fabric.placeholder; import eu.pb4.placeholders.PlaceholderAPI; import eu.pb4.placeholders.PlaceholderResult; + import me.lucko.spark.common.SparkPlatform; import me.lucko.spark.common.command.modules.HealthModule; import me.lucko.spark.common.monitor.cpu.CpuMonitor; import me.lucko.spark.common.monitor.tick.TickStatistics; import me.lucko.spark.common.util.RollingAverage; + import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.minecraft.text.Text; diff --git a/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricClientSparkPlugin.java b/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricClientSparkPlugin.java index 0948225..c173a0b 100644 --- a/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricClientSparkPlugin.java +++ b/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricClientSparkPlugin.java @@ -55,16 +55,6 @@ public class FabricClientSparkPlugin extends FabricSparkPlugin implements Sugges public static void register(FabricSparkMod mod, MinecraftClient client) { FabricClientSparkPlugin plugin = new FabricClientSparkPlugin(mod, client); plugin.enable(); - - // ensure commands are registered - plugin.scheduler.scheduleWithFixedDelay(plugin::checkCommandRegistered, 10, 10, TimeUnit.SECONDS); - - // register shutdown hook - ClientLifecycleEvents.CLIENT_STOPPING.register(stoppingClient -> { - if (stoppingClient == plugin.minecraft) { - plugin.disable(); - } - }); } private final MinecraftClient minecraft; @@ -75,6 +65,23 @@ public class FabricClientSparkPlugin extends FabricSparkPlugin implements Sugges this.minecraft = minecraft; } + @Override + public void enable() { + super.enable(); + + // ensure commands are registered + this.scheduler.scheduleWithFixedDelay(this::checkCommandRegistered, 10, 10, TimeUnit.SECONDS); + + // events + ClientLifecycleEvents.CLIENT_STOPPING.register(this::onDisable); + } + + private void onDisable(MinecraftClient stoppingClient) { + if (stoppingClient == this.minecraft) { + disable(); + } + } + private CommandDispatcher getPlayerCommandDispatcher() { return Optional.ofNullable(this.minecraft.player) .map(player -> player.networkHandler) diff --git a/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricServerSparkPlugin.java b/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricServerSparkPlugin.java index 8d38b1c..617564a 100644 --- a/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricServerSparkPlugin.java +++ b/spark-fabric/src/main/java/me/lucko/spark/fabric/plugin/FabricServerSparkPlugin.java @@ -21,6 +21,7 @@ package me.lucko.spark.fabric.plugin; import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.suggestion.SuggestionProvider; @@ -36,10 +37,8 @@ import me.lucko.spark.fabric.FabricPlatformInfo; import me.lucko.spark.fabric.FabricSparkMod; import me.lucko.spark.fabric.FabricTickHook; import me.lucko.spark.fabric.FabricTickReporter; - import me.lucko.spark.fabric.placeholder.SparkFabricPlaceholderApi; -import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; + import net.fabricmc.loader.api.FabricLoader; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.MinecraftServer; @@ -52,25 +51,10 @@ import java.util.stream.Stream; public class FabricServerSparkPlugin extends FabricSparkPlugin implements Command, SuggestionProvider { - public static void register(FabricSparkMod mod, MinecraftServer server) { + public static FabricServerSparkPlugin register(FabricSparkMod mod, MinecraftServer server) { FabricServerSparkPlugin plugin = new FabricServerSparkPlugin(mod, server); plugin.enable(); - - // register commands - registerCommands(server.getCommandManager().getDispatcher(), plugin, plugin, "spark"); - CommandRegistrationCallback.EVENT.register((dispatcher, isDedicated) -> registerCommands(dispatcher, plugin, plugin, "spark")); - - - if (FabricLoader.getInstance().isModLoaded("placeholder-api")) { - new SparkFabricPlaceholderApi(plugin.platform); - } - - // register shutdown hook - ServerLifecycleEvents.SERVER_STOPPING.register(stoppingServer -> { - if (stoppingServer == plugin.server) { - plugin.disable(); - } - }); + return plugin; } private final MinecraftServer server; @@ -80,6 +64,23 @@ public class FabricServerSparkPlugin extends FabricSparkPlugin implements Comman this.server = server; } + @Override + public void enable() { + super.enable(); + + // register commands + registerCommands(this.server.getCommandManager().getDispatcher()); + + // placeholders + if (FabricLoader.getInstance().isModLoaded("placeholder-api")) { + new SparkFabricPlaceholderApi(this.platform); + } + } + + public void registerCommands(CommandDispatcher dispatcher) { + registerCommands(dispatcher, this, this, "spark"); + } + @Override public int run(CommandContext context) throws CommandSyntaxException { String[] args = processArgs(context, false); diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkMod.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkMod.java index 02a2ebc..3321d12 100644 --- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkMod.java +++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkMod.java @@ -24,7 +24,7 @@ import me.lucko.spark.forge.plugin.ForgeClientSparkPlugin; import me.lucko.spark.forge.plugin.ForgeServerSparkPlugin; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.RegisterCommandsEvent; +import net.minecraftforge.event.server.ServerAboutToStartEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.IExtensionPoint; import net.minecraftforge.fml.ModContainer; @@ -61,15 +61,15 @@ public class ForgeSparkMod { this.configDirectory = FMLPaths.CONFIGDIR.get().resolve(this.container.getModId()); } - @SubscribeEvent - public void registerCommands(RegisterCommandsEvent e) { - ForgeServerSparkPlugin.register(this, e); - } - public void clientInit(FMLClientSetupEvent e) { ForgeClientSparkPlugin.register(this, e); } + @SubscribeEvent + public void serverInit(ServerAboutToStartEvent e) { + ForgeServerSparkPlugin.register(this, e); + } + public Path getConfigDirectory() { if (this.configDirectory == null) { throw new IllegalStateException("Config directory not set"); diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeClientSparkPlugin.java b/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeClientSparkPlugin.java index 95bb2d1..4d1bebe 100644 --- a/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeClientSparkPlugin.java +++ b/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeClientSparkPlugin.java @@ -58,12 +58,6 @@ public class ForgeClientSparkPlugin extends ForgeSparkPlugin implements Suggesti public static void register(ForgeSparkMod mod, FMLClientSetupEvent event) { ForgeClientSparkPlugin plugin = new ForgeClientSparkPlugin(mod, Minecraft.getInstance()); plugin.enable(); - - // register listeners - MinecraftForge.EVENT_BUS.register(plugin); - - // ensure commands are registered - plugin.scheduler.scheduleWithFixedDelay(plugin::checkCommandRegistered, 10, 10, TimeUnit.SECONDS); } private final Minecraft minecraft; @@ -74,6 +68,17 @@ public class ForgeClientSparkPlugin extends ForgeSparkPlugin implements Suggesti this.minecraft = minecraft; } + @Override + public void enable() { + super.enable(); + + // ensure commands are registered + this.scheduler.scheduleWithFixedDelay(this::checkCommandRegistered, 10, 10, TimeUnit.SECONDS); + + // register listeners + MinecraftForge.EVENT_BUS.register(this); + } + private CommandDispatcher getPlayerCommandDispatcher() { return Optional.ofNullable(this.minecraft.player) .map(player -> player.connection) diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeServerSparkPlugin.java b/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeServerSparkPlugin.java index 4a2416f..c03bb05 100644 --- a/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeServerSparkPlugin.java +++ b/spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeServerSparkPlugin.java @@ -45,9 +45,9 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.RegisterCommandsEvent; import net.minecraftforge.event.TickEvent; +import net.minecraftforge.event.server.ServerAboutToStartEvent; import net.minecraftforge.event.server.ServerStoppingEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.server.ServerLifecycleHooks; import net.minecraftforge.server.permission.PermissionAPI; import net.minecraftforge.server.permission.events.PermissionGatherEvent; import net.minecraftforge.server.permission.nodes.PermissionNode; @@ -59,35 +59,48 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; -import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; public class ForgeServerSparkPlugin extends ForgeSparkPlugin implements Command, SuggestionProvider { - public static void register(ForgeSparkMod mod, RegisterCommandsEvent event) { - ForgeServerSparkPlugin plugin = new ForgeServerSparkPlugin(mod, ServerLifecycleHooks::getCurrentServer); + public static void register(ForgeSparkMod mod, ServerAboutToStartEvent event) { + ForgeServerSparkPlugin plugin = new ForgeServerSparkPlugin(mod, event.getServer()); plugin.enable(); - - // register listeners - MinecraftForge.EVENT_BUS.register(plugin); - - // register commands & permissions - CommandDispatcher dispatcher = event.getDispatcher(); - registerCommands(dispatcher, plugin, plugin, "spark"); } - private final Supplier server; + private final MinecraftServer server; private Map> registeredPermissions = Collections.emptyMap(); - public ForgeServerSparkPlugin(ForgeSparkMod mod, Supplier server) { + public ForgeServerSparkPlugin(ForgeSparkMod mod, MinecraftServer server) { super(mod); this.server = server; } + @Override + public void enable() { + super.enable(); + + // register commands + registerCommands(this.server.getCommands().getDispatcher()); + + // register listeners + MinecraftForge.EVENT_BUS.register(this); + } + + @Override + public void disable() { + super.disable(); + + // unregister listeners + MinecraftForge.EVENT_BUS.unregister(this); + } + @SubscribeEvent public void onDisable(ServerStoppingEvent event) { - disable(); + if (event.getServer() == this.server) { + disable(); + } } @SubscribeEvent @@ -112,6 +125,15 @@ public class ForgeServerSparkPlugin extends ForgeSparkPlugin implements Command< this.registeredPermissions = builder.build(); } + @SubscribeEvent + public void onCommandRegister(RegisterCommandsEvent e) { + registerCommands(e.getDispatcher()); + } + + private void registerCommands(CommandDispatcher dispatcher) { + registerCommands(dispatcher, this, this, "spark"); + } + @Override public int run(CommandContext context) throws CommandSyntaxException { String[] args = processArgs(context, false); @@ -163,8 +185,8 @@ public class ForgeServerSparkPlugin extends ForgeSparkPlugin implements Command< @Override public Stream getCommandSenders() { return Stream.concat( - this.server.get().getPlayerList().getPlayers().stream(), - Stream.of(this.server.get()) + this.server.getPlayerList().getPlayers().stream(), + Stream.of(this.server) ).map(sender -> new ForgeCommandSender(sender, this)); } -- cgit From 9dac1cf14644720d011a1145b354f4c29eb139fb Mon Sep 17 00:00:00 2001 From: Luck Date: Thu, 23 Dec 2021 12:44:31 +0000 Subject: Bump version --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 31dd226..759d542 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ subprojects { apply plugin: 'java-library' ext { - pluginVersion = '1.6.4' + pluginVersion = '1.6.5' pluginDescription = 'spark is a performance profiling plugin/mod for Minecraft clients, servers and proxies.' } -- cgit From 97320645783f21893a4a8dc3af0a29804f1cf6dd Mon Sep 17 00:00:00 2001 From: Luck Date: Thu, 23 Dec 2021 12:49:21 +0000 Subject: Remove Forge 1.12.2 module The current downloads for this version will remain on CurseForge, but it will no longer be updated with new features. --- settings.gradle | 1 - spark-forge1122/build.gradle | 82 ----------- .../lucko/spark/forge/Forge1122CommandSender.java | 75 ---------- .../lucko/spark/forge/Forge1122PlatformInfo.java | 53 ------- .../me/lucko/spark/forge/Forge1122SparkMod.java | 83 ----------- .../me/lucko/spark/forge/Forge1122TickHook.java | 60 -------- .../lucko/spark/forge/Forge1122TickReporter.java | 66 --------- .../forge/plugin/Forge1122ClientSparkPlugin.java | 90 ------------ .../forge/plugin/Forge1122ServerSparkPlugin.java | 98 ------------- .../spark/forge/plugin/Forge1122SparkPlugin.java | 153 --------------------- spark-forge1122/src/main/resources/mcmod.info | 7 - 11 files changed, 768 deletions(-) delete mode 100644 spark-forge1122/build.gradle delete mode 100644 spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122CommandSender.java delete mode 100644 spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122PlatformInfo.java delete mode 100644 spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122SparkMod.java delete mode 100644 spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122TickHook.java delete mode 100644 spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122TickReporter.java delete mode 100644 spark-forge1122/src/main/java/me/lucko/spark/forge/plugin/Forge1122ClientSparkPlugin.java delete mode 100644 spark-forge1122/src/main/java/me/lucko/spark/forge/plugin/Forge1122ServerSparkPlugin.java delete mode 100644 spark-forge1122/src/main/java/me/lucko/spark/forge/plugin/Forge1122SparkPlugin.java delete mode 100644 spark-forge1122/src/main/resources/mcmod.info diff --git a/settings.gradle b/settings.gradle index fc72d02..843c836 100644 --- a/settings.gradle +++ b/settings.gradle @@ -20,7 +20,6 @@ include ( 'spark-sponge', 'spark-sponge8', 'spark-forge', - 'spark-forge1122', 'spark-fabric', 'spark-nukkit', 'spark-waterdog', diff --git a/spark-forge1122/build.gradle b/spark-forge1122/build.gradle deleted file mode 100644 index 5c40d04..0000000 --- a/spark-forge1122/build.gradle +++ /dev/null @@ -1,82 +0,0 @@ -buildscript { - repositories { - maven { url = "https://files.minecraftforge.net/maven" } - } - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true - } -} - -plugins { - id 'net.kyori.blossom' version '1.3.0' - id 'com.github.johnrengelman.shadow' version '7.0.0' -} - -apply plugin: 'net.minecraftforge.gradle' - -minecraft { - mappings channel: 'snapshot', version: '20171003-1.12' -} - -configurations { - shade - implementation.extendsFrom shade -} - -// https://github.com/MinecraftForge/ForgeGradle/issues/627#issuecomment-533927535 -configurations.all { - resolutionStrategy { - force 'org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209' - } -} - -dependencies { - minecraft 'net.minecraftforge:forge:1.12.2-14.23.5.2854' - shade project(':spark-common') -} - -processResources { - from(sourceSets.main.resources.srcDirs) { - include 'mcmod.info' - expand ( - 'pluginVersion': project.pluginVersion, - 'pluginDescription': project.pluginDescription - ) - } -} - -blossom { - replaceTokenIn('src/main/java/me/lucko/spark/forge/Forge1122SparkMod.java') - replaceToken '@version@', project.pluginVersion -} - -shadowJar { - archiveName = 'spark-forge1122.jar' - configurations = [project.configurations.shade] - - relocate 'okio', 'me.lucko.spark.lib.okio' - relocate 'okhttp3', 'me.lucko.spark.lib.okhttp3' - relocate 'net.kyori.adventure', 'me.lucko.spark.lib.adventure' - relocate 'net.kyori.examination', 'me.lucko.spark.lib.adventure.examination' - relocate 'net.bytebuddy', 'me.lucko.spark.lib.bytebuddy' - relocate 'org.tukaani.xz', 'me.lucko.spark.lib.xz' - relocate 'com.google.protobuf', 'me.lucko.spark.lib.protobuf' - relocate 'org.objectweb.asm', 'me.lucko.spark.lib.asm' - relocate 'one.profiler', 'me.lucko.spark.lib.asyncprofiler' - - exclude 'module-info.class' - exclude 'META-INF/maven/**' - exclude 'META-INF/proguard/**' -} - -artifacts { - archives shadowJar - shadow shadowJar -} - -reobf { - shadowJar { - dependsOn createMcpToSrg - mappings = createMcpToSrg.outputs.files.singleFile - } -} diff --git a/spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122CommandSender.java b/spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122CommandSender.java deleted file mode 100644 index 7e7d73c..0000000 --- a/spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122CommandSender.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * 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 me.lucko.spark.forge; - -import me.lucko.spark.common.command.sender.AbstractCommandSender; -import me.lucko.spark.forge.plugin.Forge1122SparkPlugin; - -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.minecraft.command.ICommandSender; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.network.rcon.RConConsoleSource; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.text.ITextComponent; - -import java.util.UUID; - -public class Forge1122CommandSender extends AbstractCommandSender { - private final Forge1122SparkPlugin plugin; - - public Forge1122CommandSender(ICommandSender source, Forge1122SparkPlugin plugin) { - super(source); - this.plugin = plugin; - } - - @Override - public String getName() { - if (super.delegate instanceof EntityPlayer) { - return ((EntityPlayer) super.delegate).getGameProfile().getName(); - } else if (super.delegate instanceof MinecraftServer) { - return "Console"; - } else if (super.delegate instanceof RConConsoleSource) { - return "RCON Console"; - } else { - return "unknown:" + super.delegate.getClass().getSimpleName(); - } - } - - @Override - public UUID getUniqueId() { - if (super.delegate instanceof EntityPlayer) { - return ((EntityPlayer) super.delegate).getUniqueID(); - } - return null; - } - - @Override - public void sendMessage(Component message) { - ITextComponent component = ITextComponent.Serializer.jsonToComponent(GsonComponentSerializer.gson().serialize(message)); - super.delegate.sendMessage(component); - } - - @Override - public boolean hasPermission(String permission) { - return this.plugin.hasPermission(super.delegate, permission); - } -} diff --git a/spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122PlatformInfo.java b/spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122PlatformInfo.java deleted file mode 100644 index 379c0e3..0000000 --- a/spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122PlatformInfo.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * 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 me.lucko.spark.forge; - -import me.lucko.spark.common.platform.AbstractPlatformInfo; - -import net.minecraftforge.common.ForgeVersion; - -public class Forge1122PlatformInfo extends AbstractPlatformInfo { - private final Type type; - - public Forge1122PlatformInfo(Type type) { - this.type = type; - } - - @Override - public Type getType() { - return this.type; - } - - @Override - public String getName() { - return "Forge"; - } - - @Override - public String getVersion() { - return ForgeVersion.getVersion(); - } - - @Override - public String getMinecraftVersion() { - return ForgeVersion.mcVersion; - } -} diff --git a/spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122SparkMod.java b/spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122SparkMod.java deleted file mode 100644 index 535c69e..0000000 --- a/spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122SparkMod.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * 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 me.lucko.spark.forge; - -import me.lucko.spark.forge.plugin.Forge1122ClientSparkPlugin; -import me.lucko.spark.forge.plugin.Forge1122ServerSparkPlugin; - -import net.minecraftforge.fml.common.FMLCommonHandler; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.Mod.EventHandler; -import net.minecraftforge.fml.common.event.FMLInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; -import net.minecraftforge.fml.common.event.FMLServerStartingEvent; -import net.minecraftforge.fml.common.event.FMLServerStoppingEvent; -import net.minecraftforge.fml.relauncher.Side; - -import java.nio.file.Path; - -@Mod( - modid = "spark", - name = "spark", - version = "@version@", - acceptableRemoteVersions = "*" -) -public class Forge1122SparkMod { - - private Path configDirectory; - private Forge1122ServerSparkPlugin activeServerPlugin; - - public String getVersion() { - return Forge1122SparkMod.class.getAnnotation(Mod.class).version(); - } - - @EventHandler - public void preInit(FMLPreInitializationEvent e) { - this.configDirectory = e.getModConfigurationDirectory().toPath(); - } - - @EventHandler - public void clientInit(FMLInitializationEvent e) { - if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { - Forge1122ClientSparkPlugin.register(this); - } - } - - @EventHandler - public void serverInit(FMLServerStartingEvent e) { - this.activeServerPlugin = Forge1122ServerSparkPlugin.register(this, e); - } - - @EventHandler - public void serverStop(FMLServerStoppingEvent e) { - if (this.activeServerPlugin != null) { - this.activeServerPlugin.disable(); - this.activeServerPlugin = null; - } - } - - public Path getConfigDirectory() { - if (this.configDirectory == null) { - throw new IllegalStateException("Config directory not set"); - } - return this.configDirectory; - } -} diff --git a/spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122TickHook.java b/spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122TickHook.java deleted file mode 100644 index 7ff9893..0000000 --- a/spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122TickHook.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * 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 me.lucko.spark.forge; - -import me.lucko.spark.common.tick.AbstractTickHook; -import me.lucko.spark.common.tick.TickHook; - -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; - -public class Forge1122TickHook extends AbstractTickHook implements TickHook { - private final TickEvent.Type type; - - public Forge1122TickHook(TickEvent.Type type) { - this.type = type; - } - - @SubscribeEvent - public void onTick(TickEvent e) { - if (e.phase != TickEvent.Phase.START) { - return; - } - - if (e.type != this.type) { - return; - } - - onTick(); - } - - @Override - public void start() { - MinecraftForge.EVENT_BUS.register(this); - } - - @Override - public void close() { - MinecraftForge.EVENT_BUS.unregister(this); - } - -} diff --git a/spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122TickReporter.java b/spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122TickReporter.java deleted file mode 100644 index cd2cfd8..0000000 --- a/spark-forge1122/src/main/java/me/lucko/spark/forge/Forge1122TickReporter.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * 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 me.lucko.spark.forge; - -import me.lucko.spark.common.tick.SimpleTickReporter; -import me.lucko.spark.common.tick.TickReporter; - -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; - -public class Forge1122TickReporter extends SimpleTickReporter implements TickReporter { - private final TickEvent.Type type; - - public Forge1122TickReporter(TickEvent.Type type) { - this.type = type; - } - - @SubscribeEvent - public void onTick(TickEvent e) { - if (e.type != this.type) { - return; - } - - switch (e.phase) { - case START: - onStart(); - break; - case END: - onEnd(); - break; - default: - throw new AssertionError(e.phase); - } - } - - @Override - public void start() { - MinecraftForge.EVENT_BUS.register(this); - } - - @Override - public void close() { - MinecraftForge.EVENT_BUS.unregister(this); - super.close(); - } - -} diff --git a/spark-forge1122/src/main/java/me/lucko/spark/forge/plugin/Forge1122ClientSparkPlugin.java b/spark-forge1122/src/main/java/me/lucko/spark/forge/plugin/Forge1122ClientSparkPlugin.java deleted file mode 100644 index 7ab0356..0000000 --- a/spark-forge1122/src/main/java/me/lucko/spark/forge/plugin/Forge1122ClientSparkPlugin.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * 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 me.lucko.spark.forge.plugin; - -import me.lucko.spark.common.platform.PlatformInfo; -import me.lucko.spark.common.tick.TickHook; -import me.lucko.spark.common.tick.TickReporter; -import me.lucko.spark.forge.Forge1122CommandSender; -import me.lucko.spark.forge.Forge1122PlatformInfo; -import me.lucko.spark.forge.Forge1122SparkMod; -import me.lucko.spark.forge.Forge1122TickHook; -import me.lucko.spark.forge.Forge1122TickReporter; - -import net.minecraft.client.Minecraft; -import net.minecraft.command.ICommandSender; -import net.minecraftforge.client.ClientCommandHandler; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.gameevent.TickEvent; - -import java.util.stream.Stream; - -public class Forge1122ClientSparkPlugin extends Forge1122SparkPlugin { - - public static void register(Forge1122SparkMod mod) { - Forge1122ClientSparkPlugin plugin = new Forge1122ClientSparkPlugin(mod, Minecraft.getMinecraft()); - plugin.enable(); - - // register listeners - MinecraftForge.EVENT_BUS.register(plugin); - - // register commands - ClientCommandHandler.instance.registerCommand(plugin); - } - - private final Minecraft minecraft; - - public Forge1122ClientSparkPlugin(Forge1122SparkMod mod, Minecraft minecraft) { - super(mod); - this.minecraft = minecraft; - } - - @Override - public boolean hasPermission(ICommandSender sender, String permission) { - return true; - } - - @Override - public Stream getCommandSenders() { - return Stream.of(new Forge1122CommandSender(this.minecraft.player, this)); - } - - @Override - public TickHook createTickHook() { - return new Forge1122TickHook(TickEvent.Type.CLIENT); - } - - @Override - public TickReporter createTickReporter() { - return new Forge1122TickReporter(TickEvent.Type.CLIENT); - } - - @Override - public PlatformInfo getPlatformInfo() { - return new Forge1122PlatformInfo(PlatformInfo.Type.CLIENT); - } - - @Override - public String getCommandName() { - return "sparkc"; - } - -} diff --git a/spark-forge1122/src/main/java/me/lucko/spark/forge/plugin/Forge1122ServerSparkPlugin.java b/spark-forge1122/src/main/java/me/lucko/spark/forge/plugin/Forge1122ServerSparkPlugin.java deleted file mode 100644 index 72b1429..0000000 --- a/spark-forge1122/src/main/java/me/lucko/spark/forge/plugin/Forge1122ServerSparkPlugin.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * 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 me.lucko.spark.forge.plugin; - -import me.lucko.spark.common.platform.PlatformInfo; -import me.lucko.spark.common.tick.TickHook; -import me.lucko.spark.common.tick.TickReporter; -import me.lucko.spark.forge.Forge1122CommandSender; -import me.lucko.spark.forge.Forge1122PlatformInfo; -import me.lucko.spark.forge.Forge1122SparkMod; -import me.lucko.spark.forge.Forge1122TickHook; -import me.lucko.spark.forge.Forge1122TickReporter; - -import net.minecraft.command.ICommandSender; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.server.MinecraftServer; -import net.minecraftforge.fml.common.event.FMLServerStartingEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; -import net.minecraftforge.server.permission.DefaultPermissionLevel; -import net.minecraftforge.server.permission.PermissionAPI; - -import java.util.stream.Stream; - -public class Forge1122ServerSparkPlugin extends Forge1122SparkPlugin { - - public static Forge1122ServerSparkPlugin register(Forge1122SparkMod mod, FMLServerStartingEvent event) { - Forge1122ServerSparkPlugin plugin = new Forge1122ServerSparkPlugin(mod, event.getServer()); - plugin.enable(); - - // register commands & permissions - event.registerServerCommand(plugin); - PermissionAPI.registerNode("spark", DefaultPermissionLevel.OP, "Access to the spark command"); - - return plugin; - } - - private final MinecraftServer server; - - public Forge1122ServerSparkPlugin(Forge1122SparkMod mod, MinecraftServer server) { - super(mod); - this.server = server; - } - - @Override - public boolean hasPermission(ICommandSender sender, String permission) { - if (sender instanceof EntityPlayer) { - return PermissionAPI.hasPermission((EntityPlayer) sender, permission); - } else { - return true; - } - } - - @Override - public Stream getCommandSenders() { - return Stream.concat( - this.server.getPlayerList().getPlayers().stream(), - Stream.of(this.server) - ).map(sender -> new Forge1122CommandSender(sender, this)); - } - - @Override - public TickHook createTickHook() { - return new Forge1122TickHook(TickEvent.Type.SERVER); - } - - @Override - public TickReporter createTickReporter() { - return new Forge1122TickReporter(TickEvent.Type.SERVER); - } - - @Override - public PlatformInfo getPlatformInfo() { - return new Forge1122PlatformInfo(PlatformInfo.Type.SERVER); - } - - @Override - public String getCommandName() { - return "spark"; - } -} diff --git a/spark-forge1122/src/main/java/me/lucko/spark/forge/plugin/Forge1122SparkPlugin.java b/spark-forge1122/src/main/java/me/lucko/spark/forge/plugin/Forge1122SparkPlugin.java deleted file mode 100644 index 727a2fd..0000000 --- a/spark-forge1122/src/main/java/me/lucko/spark/forge/plugin/Forge1122SparkPlugin.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * This file is part of spark. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * 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 me.lucko.spark.forge.plugin; - -import me.lucko.spark.common.SparkPlatform; -import me.lucko.spark.common.SparkPlugin; -import me.lucko.spark.common.sampler.ThreadDumper; -import me.lucko.spark.forge.Forge1122CommandSender; -import me.lucko.spark.forge.Forge1122SparkMod; - -import net.minecraft.command.ICommand; -import net.minecraft.command.ICommandSender; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.math.BlockPos; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.nio.file.Path; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.logging.Level; - -import javax.annotation.Nullable; - -public abstract class Forge1122SparkPlugin implements SparkPlugin, ICommand { - - private final Forge1122SparkMod mod; - private final Logger logger; - protected final ScheduledExecutorService scheduler; - protected final SparkPlatform platform; - protected final ThreadDumper.GameThread threadDumper = new ThreadDumper.GameThread(); - - protected Forge1122SparkPlugin(Forge1122SparkMod mod) { - this.mod = mod; - this.logger = LogManager.getLogger("spark"); - this.scheduler = Executors.newSingleThreadScheduledExecutor(r -> { - Thread thread = Executors.defaultThreadFactory().newThread(r); - thread.setName("spark-forge-async-worker"); - thread.setDaemon(true); - return thread; - }); - this.platform = new SparkPlatform(this); - } - - public void enable() { - this.platform.enable(); - } - - public void disable() { - this.platform.disable(); - this.scheduler.shutdown(); - } - - public abstract boolean hasPermission(ICommandSender sender, String permission); - - @Override - public String getVersion() { - return this.mod.getVersion(); - } - - @Override - public Path getPluginDirectory() { - return this.mod.getConfigDirectory(); - } - - @Override - public void executeAsync(Runnable task) { - this.scheduler.execute(task); - } - - @Override - public void log(Level level, String msg) { - if (level == Level.INFO) { - this.logger.info(msg); - } else if (level == Level.WARNING) { - this.logger.warn(msg); - } else if (level == Level.SEVERE) { - this.logger.error(msg); - } else { - throw new IllegalArgumentException(level.getName()); - } - } - - @Override - public ThreadDumper getDefaultThreadDumper() { - return this.threadDumper.get(); - } - - // implement ICommand - - @Override - public String getName() { - return getCommandName(); - } - - @Override - public String getUsage(ICommandSender iCommandSender) { - return "/" + getCommandName(); - } - - @Override - public List getAliases() { - return Collections.singletonList(getCommandName()); - } - - @Override - public void execute(MinecraftServer server, ICommandSender sender, String[] args) { - this.threadDumper.ensureSetup(); - this.platform.executeCommand(new Forge1122CommandSender(sender, this), args); - } - - @Override - public List getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, @Nullable BlockPos blockPos) { - return this.platform.tabCompleteCommand(new Forge1122CommandSender(sender, this), args); - } - - @Override - public boolean checkPermission(MinecraftServer minecraftServer, ICommandSender sender) { - return this.platform.hasPermissionForAnyCommand(new Forge1122CommandSender(sender, this)); - } - - @Override - public boolean isUsernameIndex(String[] strings, int i) { - return false; - } - - @Override - public int compareTo(ICommand o) { - return getCommandName().compareTo(o.getName()); - } - -} diff --git a/spark-forge1122/src/main/resources/mcmod.info b/spark-forge1122/src/main/resources/mcmod.info deleted file mode 100644 index 1c2c241..0000000 --- a/spark-forge1122/src/main/resources/mcmod.info +++ /dev/null @@ -1,7 +0,0 @@ -[{ - "modid": "spark", - "name": "spark", - "description": "${pluginDescription}", - "version": "${pluginVersion}", - "authors": ["Luck"] -}] -- cgit From bfbbcb3e68e019da4657ef0da22b889de656ae3f Mon Sep 17 00:00:00 2001 From: Luck Date: Tue, 28 Dec 2021 18:12:33 +0000 Subject: Include platform and system statistics in profiler viewer payload --- build.gradle | 2 +- .../me/lucko/spark/bukkit/BukkitPlatformInfo.java | 4 +- .../spark/bungeecord/BungeeCordPlatformInfo.java | 4 +- spark-common/build.gradle | 4 +- .../java/me/lucko/spark/common/SparkPlatform.java | 7 + .../spark/common/api/GarbageCollectorInfo.java | 6 +- .../spark/common/command/modules/HealthModule.java | 35 ++-- .../common/command/modules/HeapAnalysisModule.java | 85 +--------- .../common/command/modules/SamplerModule.java | 4 +- .../spark/common/heapdump/HeapDumpSummary.java | 16 +- .../lucko/spark/common/monitor/disk/DiskUsage.java | 63 ++++++++ .../monitor/memory/GarbageCollectorStatistics.java | 10 ++ .../spark/common/monitor/memory/MemoryInfo.java | 74 +++++++++ .../spark/common/monitor/tick/TickStatistics.java | 10 +- .../common/platform/AbstractPlatformInfo.java | 17 -- .../lucko/spark/common/platform/PlatformInfo.java | 38 +---- .../platform/PlatformStatisticsProvider.java | 165 +++++++++++++++++++ .../spark/common/sampler/AbstractSampler.java | 14 ++ .../me/lucko/spark/common/sampler/Sampler.java | 6 +- .../lucko/spark/common/sampler/ThreadDumper.java | 2 +- .../lucko/spark/common/sampler/ThreadGrouper.java | 2 +- .../common/sampler/aggregator/DataAggregator.java | 2 +- .../common/sampler/async/AsyncDataAggregator.java | 2 +- .../common/sampler/async/AsyncProfilerAccess.java | 2 +- .../spark/common/sampler/async/AsyncSampler.java | 16 +- .../spark/common/sampler/java/JavaSampler.java | 12 +- .../common/sampler/java/SimpleDataAggregator.java | 2 +- .../common/sampler/java/TickedDataAggregator.java | 2 +- .../spark/common/sampler/node/StackTraceNode.java | 6 +- .../spark/common/sampler/node/ThreadNode.java | 6 +- .../me/lucko/spark/common/util/Compression.java | 100 ++++++++++++ spark-common/src/main/proto/spark/spark.proto | 176 +++++++++++---------- spark-common/src/main/proto/spark/spark_heap.proto | 27 ++++ .../src/main/proto/spark/spark_sampler.proto | 71 +++++++++ .../src/main/resources/linux/libasyncProfiler.so | Bin 398099 -> 0 bytes .../src/main/resources/macosx/libasyncProfiler.so | Bin 599568 -> 0 bytes .../main/resources/spark/linux/libasyncProfiler.so | Bin 0 -> 398099 bytes .../resources/spark/macosx/libasyncProfiler.so | Bin 0 -> 599568 bytes .../me/lucko/spark/fabric/FabricPlatformInfo.java | 4 +- .../me/lucko/spark/forge/ForgePlatformInfo.java | 4 +- .../me/lucko/spark/nukkit/NukkitPlatformInfo.java | 4 +- .../me/lucko/spark/sponge/SpongePlatformInfo.java | 4 +- .../me/lucko/spark/sponge/Sponge8PlatformInfo.java | 4 +- .../lucko/spark/velocity/VelocityPlatformInfo.java | 4 +- .../spark/velocity/Velocity4PlatformInfo.java | 4 +- .../lucko/spark/waterdog/WaterdogPlatformInfo.java | 4 +- 46 files changed, 729 insertions(+), 295 deletions(-) create mode 100644 spark-common/src/main/java/me/lucko/spark/common/monitor/disk/DiskUsage.java create mode 100644 spark-common/src/main/java/me/lucko/spark/common/monitor/memory/MemoryInfo.java delete mode 100644 spark-common/src/main/java/me/lucko/spark/common/platform/AbstractPlatformInfo.java create mode 100644 spark-common/src/main/java/me/lucko/spark/common/platform/PlatformStatisticsProvider.java create mode 100644 spark-common/src/main/java/me/lucko/spark/common/util/Compression.java create mode 100644 spark-common/src/main/proto/spark/spark_heap.proto create mode 100644 spark-common/src/main/proto/spark/spark_sampler.proto delete mode 100755 spark-common/src/main/resources/linux/libasyncProfiler.so delete mode 100755 spark-common/src/main/resources/macosx/libasyncProfiler.so create mode 100755 spark-common/src/main/resources/spark/linux/libasyncProfiler.so create mode 100755 spark-common/src/main/resources/spark/macosx/libasyncProfiler.so diff --git a/build.gradle b/build.gradle index 759d542..4acf08d 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ subprojects { apply plugin: 'java-library' ext { - pluginVersion = '1.6.5' + pluginVersion = '1.7.0' pluginDescription = 'spark is a performance profiling plugin/mod for Minecraft clients, servers and proxies.' } diff --git a/spark-bukkit/src/main/java/me/lucko/spark/bukkit/BukkitPlatformInfo.java b/spark-bukkit/src/main/java/me/lucko/spark/bukkit/BukkitPlatformInfo.java index 3f0c155..2bf17ac 100644 --- a/spark-bukkit/src/main/java/me/lucko/spark/bukkit/BukkitPlatformInfo.java +++ b/spark-bukkit/src/main/java/me/lucko/spark/bukkit/BukkitPlatformInfo.java @@ -20,14 +20,14 @@ package me.lucko.spark.bukkit; -import me.lucko.spark.common.platform.AbstractPlatformInfo; +import me.lucko.spark.common.platform.PlatformInfo; import org.bukkit.Server; import java.lang.reflect.Field; import java.lang.reflect.Method; -public class BukkitPlatformInfo extends AbstractPlatformInfo { +public class BukkitPlatformInfo implements PlatformInfo { private final Server server; public BukkitPlatformInfo(Server server) { diff --git a/spark-bungeecord/src/main/java/me/lucko/spark/bungeecord/BungeeCordPlatformInfo.java b/spark-bungeecord/src/main/java/me/lucko/spark/bungeecord/BungeeCordPlatformInfo.java index 0ac9fbd..fc5c588 100644 --- a/spark-bungeecord/src/main/java/me/lucko/spark/bungeecord/BungeeCordPlatformInfo.java +++ b/spark-bungeecord/src/main/java/me/lucko/spark/bungeecord/BungeeCordPlatformInfo.java @@ -20,11 +20,11 @@ package me.lucko.spark.bungeecord; -import me.lucko.spark.common.platform.AbstractPlatformInfo; +import me.lucko.spark.common.platform.PlatformInfo; import net.md_5.bungee.api.ProxyServer; -public class BungeeCordPlatformInfo extends AbstractPlatformInfo { +public class BungeeCordPlatformInfo implements PlatformInfo { private final ProxyServer proxy; public BungeeCordPlatformInfo(ProxyServer proxy) { diff --git a/spark-common/build.gradle b/spark-common/build.gradle index 60f823c..c1ddafb 100644 --- a/spark-common/build.gradle +++ b/spark-common/build.gradle @@ -32,8 +32,8 @@ dependencies { processResources { from(sourceSets.main.resources.srcDirs) { - include 'linux/libasyncProfiler.so' - include 'macosx/libasyncProfiler.so' + include 'spark/linux/libasyncProfiler.so' + include 'spark/macosx/libasyncProfiler.so' } } diff --git a/spark-common/src/main/java/me/lucko/spark/common/SparkPlatform.java b/spark-common/src/main/java/me/lucko/spark/common/SparkPlatform.java index 57f8732..a721adc 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/SparkPlatform.java +++ b/spark-common/src/main/java/me/lucko/spark/common/SparkPlatform.java @@ -41,6 +41,7 @@ import me.lucko.spark.common.command.tabcomplete.TabCompleter; import me.lucko.spark.common.monitor.cpu.CpuMonitor; import me.lucko.spark.common.monitor.memory.GarbageCollectorStatistics; import me.lucko.spark.common.monitor.tick.TickStatistics; +import me.lucko.spark.common.platform.PlatformStatisticsProvider; import me.lucko.spark.common.tick.TickHook; import me.lucko.spark.common.tick.TickReporter; import me.lucko.spark.common.util.BytebinClient; @@ -96,6 +97,7 @@ public class SparkPlatform { private final TickHook tickHook; private final TickReporter tickReporter; private final TickStatistics tickStatistics; + private final PlatformStatisticsProvider statisticsProvider; private Map startupGcStatistics = ImmutableMap.of(); private long serverNormalOperationStartTime; private final AtomicBoolean enabled = new AtomicBoolean(false); @@ -132,6 +134,7 @@ public class SparkPlatform { this.tickHook = plugin.createTickHook(); this.tickReporter = plugin.createTickReporter(); this.tickStatistics = this.tickHook != null ? new TickStatistics() : null; + this.statisticsProvider = new PlatformStatisticsProvider(this); } public void enable() { @@ -214,6 +217,10 @@ public class SparkPlatform { return this.tickReporter; } + public PlatformStatisticsProvider getStatisticsProvider() { + return this.statisticsProvider; + } + public ClassSourceLookup createClassSourceLookup() { return this.plugin.createClassSourceLookup(); } diff --git a/spark-common/src/main/java/me/lucko/spark/common/api/GarbageCollectorInfo.java b/spark-common/src/main/java/me/lucko/spark/common/api/GarbageCollectorInfo.java index 8d289aa..fc14c67 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/api/GarbageCollectorInfo.java +++ b/spark-common/src/main/java/me/lucko/spark/common/api/GarbageCollectorInfo.java @@ -36,10 +36,8 @@ public class GarbageCollectorInfo implements GarbageCollector { this.name = name; this.totalCollections = stats.getCollectionCount(); this.totalTime = stats.getCollectionTime(); - - double totalTimeDouble = this.totalTime; - this.averageTime = this.totalCollections == 0 ? 0 : totalTimeDouble / this.totalCollections; - this.averageFrequency = this.totalCollections == 0 ? 0 : (long) ((serverUptime - totalTimeDouble) / this.totalCollections); + this.averageTime = stats.getAverageCollectionTime(); + this.averageFrequency = stats.getAverageCollectionFrequency(serverUptime); } @Override diff --git a/spark-common/src/main/java/me/lucko/spark/common/command/modules/HealthModule.java b/spark-common/src/main/java/me/lucko/spark/common/command/modules/HealthModule.java index 51fa905..b036d21 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/command/modules/HealthModule.java +++ b/spark-common/src/main/java/me/lucko/spark/common/command/modules/HealthModule.java @@ -30,6 +30,7 @@ import me.lucko.spark.common.command.CommandResponseHandler; import me.lucko.spark.common.command.sender.CommandSender; import me.lucko.spark.common.command.tabcomplete.TabCompleter; import me.lucko.spark.common.monitor.cpu.CpuMonitor; +import me.lucko.spark.common.monitor.disk.DiskUsage; import me.lucko.spark.common.monitor.tick.TickStatistics; import me.lucko.spark.common.util.FormatUtil; import me.lucko.spark.common.util.RollingAverage; @@ -38,15 +39,11 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.TextColor; -import java.io.IOException; import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.lang.management.MemoryPoolMXBean; import java.lang.management.MemoryType; import java.lang.management.MemoryUsage; -import java.nio.file.FileStore; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.LinkedList; import java.util.List; import java.util.function.Consumer; @@ -65,8 +62,6 @@ import static net.kyori.adventure.text.format.TextDecoration.BOLD; public class HealthModule implements CommandModule { - private static final double MSPT_95_PERCENTILE = 0.95d; - @Override public void registerCommands(Consumer consumer) { consumer.accept(Command.builder() @@ -150,11 +145,7 @@ public class HealthModule implements CommandModule { addDetailedMemoryStats(report, memoryMXBean); } - try { - addDiskStats(report); - } catch (IOException e) { - e.printStackTrace(); - } + addDiskStats(report); resp.reply(report); } @@ -309,10 +300,14 @@ public class HealthModule implements CommandModule { } } - private static void addDiskStats(List report) throws IOException { - FileStore fileStore = Files.getFileStore(Paths.get(".")); - long totalSpace = fileStore.getTotalSpace(); - long usedSpace = totalSpace - fileStore.getUsableSpace(); + private static void addDiskStats(List report) { + long total = DiskUsage.getTotal(); + long used = DiskUsage.getUsed(); + + if (total == 0 || used == 0) { + return; + } + report.add(text() .append(text(">", DARK_GRAY, BOLD)) .append(space()) @@ -321,18 +316,18 @@ public class HealthModule implements CommandModule { ); report.add(text() .content(" ") - .append(text(FormatUtil.formatBytes(usedSpace), WHITE)) + .append(text(FormatUtil.formatBytes(used), WHITE)) .append(space()) .append(text("/", GRAY)) .append(space()) - .append(text(FormatUtil.formatBytes(totalSpace), WHITE)) + .append(text(FormatUtil.formatBytes(total), WHITE)) .append(text(" ")) .append(text("(", GRAY)) - .append(text(FormatUtil.percent(usedSpace, totalSpace), GREEN)) + .append(text(FormatUtil.percent(used, total), GREEN)) .append(text(")", GRAY)) .build() ); - report.add(text().content(" ").append(generateDiskUsageDiagram(usedSpace, totalSpace, 40)).build()); + report.add(text().content(" ").append(generateDiskUsageDiagram(used, total, 40)).build()); report.add(empty()); } @@ -355,7 +350,7 @@ public class HealthModule implements CommandModule { .append(text('/', GRAY)) .append(formatTickDuration(average.median())) .append(text('/', GRAY)) - .append(formatTickDuration(average.percentile(MSPT_95_PERCENTILE))) + .append(formatTickDuration(average.percentile95th())) .append(text('/', GRAY)) .append(formatTickDuration(average.max())) .build(); diff --git a/spark-common/src/main/java/me/lucko/spark/common/command/modules/HeapAnalysisModule.java b/spark-common/src/main/java/me/lucko/spark/common/command/modules/HeapAnalysisModule.java index 70f6c3c..491ec1e 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/command/modules/HeapAnalysisModule.java +++ b/spark-common/src/main/java/me/lucko/spark/common/command/modules/HeapAnalysisModule.java @@ -30,20 +30,15 @@ import me.lucko.spark.common.command.sender.CommandSender; import me.lucko.spark.common.command.tabcomplete.TabCompleter; import me.lucko.spark.common.heapdump.HeapDump; import me.lucko.spark.common.heapdump.HeapDumpSummary; +import me.lucko.spark.common.util.Compression; import me.lucko.spark.common.util.FormatUtil; -import me.lucko.spark.proto.SparkProtos; +import me.lucko.spark.proto.SparkHeapProtos; import net.kyori.adventure.text.event.ClickEvent; -import org.tukaani.xz.LZMA2Options; -import org.tukaani.xz.LZMAOutputStream; -import org.tukaani.xz.XZOutputStream; - import okhttp3.MediaType; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.Iterator; @@ -51,7 +46,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; import java.util.function.LongConsumer; -import java.util.zip.GZIPOutputStream; import static net.kyori.adventure.text.Component.text; import static net.kyori.adventure.text.format.NamedTextColor.GOLD; @@ -98,7 +92,7 @@ public class HeapAnalysisModule implements CommandModule { return; } - SparkProtos.HeapData output = heapDump.toProto(platform.getPlugin().getPlatformInfo(), sender); + SparkHeapProtos.HeapData output = heapDump.toProto(platform, sender); boolean saveToFile = false; if (arguments.boolFlag("save-to-file")) { @@ -175,11 +169,11 @@ public class HeapAnalysisModule implements CommandModule { platform.getActivityLog().addToLog(Activity.fileActivity(sender, System.currentTimeMillis(), "Heap dump", file.toString())); - CompressionMethod compressionMethod = null; + Compression compressionMethod = null; Iterator compressArgs = arguments.stringFlag("compress").iterator(); if (compressArgs.hasNext()) { try { - compressionMethod = CompressionMethod.valueOf(compressArgs.next().toUpperCase()); + compressionMethod = Compression.valueOf(compressArgs.next().toUpperCase()); } catch (IllegalArgumentException e) { // ignore } @@ -194,7 +188,7 @@ public class HeapAnalysisModule implements CommandModule { } } - private static void heapDumpCompress(SparkPlatform platform, CommandResponseHand