aboutsummaryrefslogtreecommitdiff
path: root/spark-common/src/main/java/me/lucko/spark/common/command
diff options
context:
space:
mode:
authorLuck <git@lucko.me>2019-05-13 10:22:16 +0100
committerLuck <git@lucko.me>2019-05-13 10:22:16 +0100
commitcf3ce4d9d7c443e0051eb7cff7dc71cf2a0eb851 (patch)
tree1c14254cb1a04f0ef63045f3c996a866b5d2493a /spark-common/src/main/java/me/lucko/spark/common/command
parent825c9121af03334a29da8add045b6ab5f96d19ff (diff)
downloadspark-cf3ce4d9d7c443e0051eb7cff7dc71cf2a0eb851.tar.gz
spark-cf3ce4d9d7c443e0051eb7cff7dc71cf2a0eb851.tar.bz2
spark-cf3ce4d9d7c443e0051eb7cff7dc71cf2a0eb851.zip
Ensure things are cleaned up nicely when the plugin disables
Diffstat (limited to 'spark-common/src/main/java/me/lucko/spark/common/command')
-rw-r--r--spark-common/src/main/java/me/lucko/spark/common/command/CommandModule.java6
-rw-r--r--spark-common/src/main/java/me/lucko/spark/common/command/modules/SamplerModule.java118
-rw-r--r--spark-common/src/main/java/me/lucko/spark/common/command/modules/TickMonitoringModule.java24
3 files changed, 78 insertions, 70 deletions
diff --git a/spark-common/src/main/java/me/lucko/spark/common/command/CommandModule.java b/spark-common/src/main/java/me/lucko/spark/common/command/CommandModule.java
index 76c24b3..2b536cc 100644
--- a/spark-common/src/main/java/me/lucko/spark/common/command/CommandModule.java
+++ b/spark-common/src/main/java/me/lucko/spark/common/command/CommandModule.java
@@ -22,8 +22,12 @@ package me.lucko.spark.common.command;
import java.util.function.Consumer;
-public interface CommandModule {
+public interface CommandModule extends AutoCloseable {
void registerCommands(Consumer<Command> consumer);
+ @Override
+ default void close() {
+
+ }
}
diff --git a/spark-common/src/main/java/me/lucko/spark/common/command/modules/SamplerModule.java b/spark-common/src/main/java/me/lucko/spark/common/command/modules/SamplerModule.java
index c4f88cb..11d23da 100644
--- a/spark-common/src/main/java/me/lucko/spark/common/command/modules/SamplerModule.java
+++ b/spark-common/src/main/java/me/lucko/spark/common/command/modules/SamplerModule.java
@@ -50,12 +50,18 @@ import java.util.function.Consumer;
public class SamplerModule implements CommandModule {
private static final MediaType JSON_TYPE = MediaType.parse("application/json; charset=utf-8");
- /** Guards {@link #activeSampler} */
- private final Object[] activeSamplerMutex = new Object[0];
/** The WarmRoast instance currently running, if any */
private Sampler activeSampler = null;
@Override
+ public void close() {
+ if (this.activeSampler != null) {
+ this.activeSampler.cancel();
+ this.activeSampler = null;
+ }
+ }
+
+ @Override
public void registerCommands(Consumer<Command> consumer) {
consumer.accept(Command.builder()
.aliases("sampler")
@@ -72,48 +78,41 @@ public class SamplerModule implements CommandModule {
.argumentUsage("include-line-numbers", null)
.executor((platform, sender, resp, arguments) -> {
if (arguments.boolFlag("info")) {
- synchronized (this.activeSamplerMutex) {
- if (this.activeSampler == null) {
- resp.replyPrefixed(TextComponent.of("There isn't an active sampling task running."));
+ if (this.activeSampler == null) {
+ resp.replyPrefixed(TextComponent.of("There isn't an active sampling task running."));
+ } else {
+ long timeout = this.activeSampler.getEndTime();
+ if (timeout == -1) {
+ resp.replyPrefixed(TextComponent.of("There is an active sampler currently running, with no defined timeout."));
} else {
- long timeout = this.activeSampler.getEndTime();
- if (timeout == -1) {
- resp.replyPrefixed(TextComponent.of("There is an active sampler currently running, with no defined timeout."));
- } else {
- long timeoutDiff = (timeout - System.currentTimeMillis()) / 1000L;
- resp.replyPrefixed(TextComponent.of("There is an active sampler currently running, due to timeout in " + timeoutDiff + " seconds."));
- }
-
- long runningTime = (System.currentTimeMillis() - this.activeSampler.getStartTime()) / 1000L;
- resp.replyPrefixed(TextComponent.of("It has been sampling for " + runningTime + " seconds so far."));
+ long timeoutDiff = (timeout - System.currentTimeMillis()) / 1000L;
+ resp.replyPrefixed(TextComponent.of("There is an active sampler currently running, due to timeout in " + timeoutDiff + " seconds."));
}
+
+ long runningTime = (System.currentTimeMillis() - this.activeSampler.getStartTime()) / 1000L;
+ resp.replyPrefixed(TextComponent.of("It has been sampling for " + runningTime + " seconds so far."));
}
return;
}
if (arguments.boolFlag("cancel")) {
- synchronized (this.activeSamplerMutex) {
- if (this.activeSampler == null) {
- resp.replyPrefixed(TextComponent.of("There isn't an active sampling task running."));
- } else {
- this.activeSampler.cancel();
- this.activeSampler = null;
- resp.broadcastPrefixed(TextComponent.of("The active sampling task has been cancelled.", TextColor.GOLD));
- }
+ if (this.activeSampler == null) {
+ resp.replyPrefixed(TextComponent.of("There isn't an active sampling task running."));
+ } else {
+ close();
+ resp.broadcastPrefixed(TextComponent.of("The active sampling task has been cancelled.", TextColor.GOLD));
}
return;
}
if (arguments.boolFlag("stop") || arguments.boolFlag("upload")) {
- synchronized (this.activeSamplerMutex) {
- if (this.activeSampler == null) {
- resp.replyPrefixed(TextComponent.of("There isn't an active sampling task running."));
- } else {
- this.activeSampler.cancel();
- resp.broadcastPrefixed(TextComponent.of("The active sampling operation has been stopped! Uploading results..."));
- handleUpload(platform, resp, this.activeSampler);
- this.activeSampler = null;
- }
+ if (this.activeSampler == null) {
+ resp.replyPrefixed(TextComponent.of("There isn't an active sampling task running."));
+ } else {
+ this.activeSampler.cancel();
+ resp.broadcastPrefixed(TextComponent.of("The active sampling operation has been stopped! Uploading results..."));
+ handleUpload(platform, resp, this.activeSampler);
+ this.activeSampler = null;
}
return;
}
@@ -172,37 +171,34 @@ public class SamplerModule implements CommandModule {
}
}
- Sampler sampler;
- synchronized (this.activeSamplerMutex) {
- if (this.activeSampler != null) {
- resp.replyPrefixed(TextComponent.of("An active sampler is already running."));
- return;
- }
+ if (this.activeSampler != null) {
+ resp.replyPrefixed(TextComponent.of("An active sampler is already running."));
+ return;
+ }
- resp.broadcastPrefixed(TextComponent.of("Initializing a new profiler, please wait..."));
+ resp.broadcastPrefixed(TextComponent.of("Initializing a new profiler, please wait..."));
- SamplerBuilder builder = new SamplerBuilder();
- builder.threadDumper(threadDumper);
- builder.threadGrouper(threadGrouper);
- if (timeoutSeconds != -1) {
- builder.completeAfter(timeoutSeconds, TimeUnit.SECONDS);
- }
- builder.samplingInterval(intervalMillis);
- builder.includeLineNumbers(includeLineNumbers);
- if (ticksOver != -1) {
- builder.ticksOver(ticksOver, tickCounter);
- }
- sampler = this.activeSampler = builder.start();
+ SamplerBuilder builder = new SamplerBuilder();
+ builder.threadDumper(threadDumper);
+ builder.threadGrouper(threadGrouper);
+ if (timeoutSeconds != -1) {
+ builder.completeAfter(timeoutSeconds, TimeUnit.SECONDS);
+ }
+ builder.samplingInterval(intervalMillis);
+ builder.includeLineNumbers(includeLineNumbers);
+ if (ticksOver != -1) {
+ builder.ticksOver(ticksOver, tickCounter);
+ }
+ Sampler sampler = this.activeSampler = builder.start();
- resp.broadcastPrefixed(TextComponent.of("Profiler now active!", TextColor.GOLD));
- if (timeoutSeconds == -1) {
- resp.broadcastPrefixed(TextComponent.of("Use '/" + platform.getPlugin().getLabel() + " sampler --stop' to stop profiling and upload the results."));
- } else {
- resp.broadcastPrefixed(TextComponent.of("The results will be automatically returned after the profiler has been running for " + timeoutSeconds + " seconds."));
- }
+ resp.broadcastPrefixed(TextComponent.of("Profiler now active!", TextColor.GOLD));
+ if (timeoutSeconds == -1) {
+ resp.broadcastPrefixed(TextComponent.of("Use '/" + platform.getPlugin().getLabel() + " sampler --stop' to stop profiling and upload the results."));
+ } else {
+ resp.broadcastPrefixed(TextComponent.of("The results will be automatically returned after the profiler has been running for " + timeoutSeconds + " seconds."));
}
- CompletableFuture<Sampler> future = sampler.getFuture();
+ CompletableFuture<Sampler> future = activeSampler.getFuture();
// send message if profiling fails
future.whenCompleteAsync((s, throwable) -> {
@@ -214,10 +210,8 @@ public class SamplerModule implements CommandModule {
// set activeSampler to null when complete.
future.whenCompleteAsync((s, throwable) -> {
- synchronized (this.activeSamplerMutex) {
- if (sampler == this.activeSampler) {
- this.activeSampler = null;
- }
+ if (sampler == this.activeSampler) {
+ this.activeSampler = null;
}
});
diff --git a/spark-common/src/main/java/me/lucko/spark/common/command/modules/TickMonitoringModule.java b/spark-common/src/main/java/me/lucko/spark/common/command/modules/TickMonitoringModule.java
index cbcf557..75d5d36 100644
--- a/spark-common/src/main/java/me/lucko/spark/common/command/modules/TickMonitoringModule.java
+++ b/spark-common/src/main/java/me/lucko/spark/common/command/modules/TickMonitoringModule.java
@@ -35,17 +35,29 @@ import java.util.function.Consumer;
public class TickMonitoringModule implements CommandModule {
/** The tick monitor instance currently running, if any */
+ private TickCounter tickCounter = null;
private ReportingTickMonitor activeTickMonitor = null;
@Override
+ public void close() {
+ if (this.activeTickMonitor != null) {
+ this.tickCounter.removeTickTask(this.activeTickMonitor);
+ this.activeTickMonitor.close();
+ this.activeTickMonitor = null;
+ }
+ }
+
+ @Override
public void registerCommands(Consumer<Command> consumer) {
consumer.accept(Command.builder()
.aliases("tickmonitoring")
.argumentUsage("threshold", "percentage increase")
.argumentUsage("without-gc", null)
.executor((platform, sender, resp, arguments) -> {
- TickCounter tickCounter = platform.getTickCounter();
- if (tickCounter == null) {
+ if (this.tickCounter == null) {
+ this.tickCounter = platform.getTickCounter();
+ }
+ if (this.tickCounter == null) {
resp.replyPrefixed(TextComponent.of("Not supported!", TextColor.RED));
return;
}
@@ -56,12 +68,10 @@ public class TickMonitoringModule implements CommandModule {
threshold = 100;
}
- this.activeTickMonitor = new ReportingTickMonitor(resp, tickCounter, threshold, !arguments.boolFlag("without-gc"));
- tickCounter.addTickTask(this.activeTickMonitor);
+ this.activeTickMonitor = new ReportingTickMonitor(resp, this.tickCounter, threshold, !arguments.boolFlag("without-gc"));
+ this.tickCounter.addTickTask(this.activeTickMonitor);
} else {
- tickCounter.removeTickTask(this.activeTickMonitor);
- this.activeTickMonitor.close();
- this.activeTickMonitor = null;
+ close();
resp.broadcastPrefixed(TextComponent.of("Tick monitor disabled."));
}
})