Ensures timings safety
This commit is contained in:
@@ -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 = "";
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user