Attempt to track server tick times more accurately
This commit is contained in:
parent
1728de0f16
commit
6bfe079175
|
|
@ -0,0 +1,24 @@
|
||||||
|
package org.embeddedt.modernfix.common.mixin.core;
|
||||||
|
|
||||||
|
import net.minecraft.Util;
|
||||||
|
import net.minecraft.server.MinecraftServer;
|
||||||
|
import org.embeddedt.modernfix.duck.ITimeTrackingServer;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
@Mixin(MinecraftServer.class)
|
||||||
|
public class MinecraftServerMixin implements ITimeTrackingServer {
|
||||||
|
private long mfix$lastTickStartTime = -1L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long mfix$getLastTickStartTime() {
|
||||||
|
return mfix$lastTickStartTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(method = "runServer", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/MinecraftServer;tickServer(Ljava/util/function/BooleanSupplier;)V"))
|
||||||
|
private void trackTickTime(CallbackInfo ci) {
|
||||||
|
mfix$lastTickStartTime = Util.getMillis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
package org.embeddedt.modernfix.duck;
|
||||||
|
|
||||||
|
public interface ITimeTrackingServer {
|
||||||
|
long mfix$getLastTickStartTime();
|
||||||
|
}
|
||||||
|
|
@ -5,8 +5,10 @@ import net.minecraft.Util;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.embeddedt.modernfix.duck.ITimeTrackingServer;
|
||||||
|
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
|
import java.util.OptionalLong;
|
||||||
|
|
||||||
public class IntegratedWatchdog extends Thread {
|
public class IntegratedWatchdog extends Thread {
|
||||||
private static final Logger LOGGER = LogManager.getLogger();
|
private static final Logger LOGGER = LogManager.getLogger();
|
||||||
|
|
@ -22,23 +24,27 @@ public class IntegratedWatchdog extends Thread {
|
||||||
this.setName("ModernFix integrated server watchdog");
|
this.setName("ModernFix integrated server watchdog");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private OptionalLong getLastTickStart() {
|
||||||
|
MinecraftServer server = this.server.get();
|
||||||
|
if(server == null || !server.isRunning())
|
||||||
|
return OptionalLong.empty();
|
||||||
|
return OptionalLong.of(((ITimeTrackingServer)server).mfix$getLastTickStartTime());
|
||||||
|
}
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
while(true) {
|
while(true) {
|
||||||
MinecraftServer server = this.server.get();
|
OptionalLong lastTickStart = getLastTickStart();
|
||||||
if(server == null || !server.isRunning())
|
if(!lastTickStart.isPresent()) {
|
||||||
return;
|
return;
|
||||||
long nextTick = server.getNextTickTime();
|
}
|
||||||
long curTime = Util.getMillis();
|
long curTime = Util.getMillis();
|
||||||
long delta = curTime - nextTick;
|
long delta = curTime - lastTickStart.getAsLong();
|
||||||
if(delta > MAX_TICK_DELTA) {
|
if(delta > MAX_TICK_DELTA) {
|
||||||
LOGGER.error("A single server tick has taken {}, more than {} milliseconds", delta, MAX_TICK_DELTA);
|
LOGGER.error("A single server tick has taken {}, more than {} milliseconds", delta, MAX_TICK_DELTA);
|
||||||
LOGGER.error(ThreadDumper.obtainThreadDump());
|
LOGGER.error(ThreadDumper.obtainThreadDump());
|
||||||
nextTick = 0;
|
|
||||||
curTime = 0;
|
|
||||||
}
|
}
|
||||||
server = null; /* allow GC */
|
|
||||||
try {
|
try {
|
||||||
Thread.sleep(nextTick + MAX_TICK_DELTA - curTime);
|
Thread.sleep(MAX_TICK_DELTA - delta);
|
||||||
} catch(InterruptedException ignored) {
|
} catch(InterruptedException ignored) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user