Ensures timings safety

This commit is contained in:
Sotr
2018-06-18 17:35:58 +08:00
parent 93588656d1
commit 239f83e1d3
2 changed files with 9 additions and 5 deletions

View File

@@ -55,8 +55,12 @@ public abstract class Akari {
public static final ExecutorCompletionService<?> STAGE_TICK = new ExecutorCompletionService<>(Executors.newSingleThreadExecutor(new AssignableFactory())); public static final ExecutorCompletionService<?> STAGE_TICK = new ExecutorCompletionService<>(Executors.newSingleThreadExecutor(new AssignableFactory()));
public static boolean isPrimaryThread() { public static boolean isPrimaryThread() {
return isPrimaryThread(true);
}
public static boolean isPrimaryThread(boolean assign) {
Thread current = Thread.currentThread(); Thread current = Thread.currentThread();
return current == MinecraftServer.getServer().primaryThread || current instanceof AssignableThread; return current == MinecraftServer.getServer().primaryThread || (assign ? current instanceof AssignableThread : false);
} }
public static final String EMPTY_STRING = ""; public static final String EMPTY_STRING = "";

View File

@@ -27,7 +27,7 @@ public abstract class MixinTimingHandler {
@Overwrite @Overwrite
public Timing startTimingIfSync() { public Timing startTimingIfSync() {
if (Akari.isPrimaryThread()) { // Use non-mock method if (Akari.isPrimaryThread(false)) { // Use non-mock method
startTiming(); startTiming();
} }
return (Timing) this; return (Timing) this;
@@ -36,12 +36,12 @@ public abstract class MixinTimingHandler {
@SuppressWarnings({ "rawtypes", "unchecked" }) @SuppressWarnings({ "rawtypes", "unchecked" })
@Inject(method = "startTiming", at = @At("HEAD"), cancellable = true) @Inject(method = "startTiming", at = @At("HEAD"), cancellable = true)
public void onStartTiming(CallbackInfoReturnable ci) { public void onStartTiming(CallbackInfoReturnable ci) {
if (!Akari.isPrimaryThread()) ci.setReturnValue(this); // Avoid modify any field if (!Akari.isPrimaryThread(false)) ci.setReturnValue(this); // Avoid modify any field
} }
@Overwrite @Overwrite
public void stopTimingIfSync() { public void stopTimingIfSync() {
if (Akari.isPrimaryThread()) { if (Akari.isPrimaryThread(false)) {
stopTiming(true); // Avoid twice thread check stopTiming(true); // Avoid twice thread check
} }
} }
@@ -53,7 +53,7 @@ public abstract class MixinTimingHandler {
public void stopTiming(boolean alreadySync) { public void stopTiming(boolean alreadySync) {
if (!enabled) return; if (!enabled) return;
if (!alreadySync && !Akari.isPrimaryThread()) { if (!alreadySync && !Akari.isPrimaryThread(false)) {
if (AkarinGlobalConfig.silentAsyncTimings) return; if (AkarinGlobalConfig.silentAsyncTimings) return;
Bukkit.getLogger().log(Level.SEVERE, "stopTiming called async for " + name); Bukkit.getLogger().log(Level.SEVERE, "stopTiming called async for " + name);