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 boolean isPrimaryThread() {
return isPrimaryThread(true);
}
public static boolean isPrimaryThread(boolean assign) {
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 = "";

View File

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