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 org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.embeddedt.modernfix.duck.ITimeTrackingServer;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.OptionalLong;
|
||||
|
||||
public class IntegratedWatchdog extends Thread {
|
||||
private static final Logger LOGGER = LogManager.getLogger();
|
||||
|
|
@ -22,23 +24,27 @@ public class IntegratedWatchdog extends Thread {
|
|||
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() {
|
||||
while(true) {
|
||||
MinecraftServer server = this.server.get();
|
||||
if(server == null || !server.isRunning())
|
||||
OptionalLong lastTickStart = getLastTickStart();
|
||||
if(!lastTickStart.isPresent()) {
|
||||
return;
|
||||
long nextTick = server.getNextTickTime();
|
||||
}
|
||||
long curTime = Util.getMillis();
|
||||
long delta = curTime - nextTick;
|
||||
long delta = curTime - lastTickStart.getAsLong();
|
||||
if(delta > MAX_TICK_DELTA) {
|
||||
LOGGER.error("A single server tick has taken {}, more than {} milliseconds", delta, MAX_TICK_DELTA);
|
||||
LOGGER.error(ThreadDumper.obtainThreadDump());
|
||||
nextTick = 0;
|
||||
curTime = 0;
|
||||
}
|
||||
server = null; /* allow GC */
|
||||
try {
|
||||
Thread.sleep(nextTick + MAX_TICK_DELTA - curTime);
|
||||
Thread.sleep(MAX_TICK_DELTA - delta);
|
||||
} catch(InterruptedException ignored) {
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user