Skip to content

Commit b088fee

Browse files
committed
Merge 1.19.2 into 1.20
2 parents def4c05 + e9ffa69 commit b088fee

File tree

3 files changed

+43
-8
lines changed

3 files changed

+43
-8
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.embeddedt.modernfix.common.mixin.core;
2+
3+
import net.minecraft.Util;
4+
import net.minecraft.server.MinecraftServer;
5+
import org.embeddedt.modernfix.duck.ITimeTrackingServer;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.injection.At;
8+
import org.spongepowered.asm.mixin.injection.Inject;
9+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
10+
11+
@Mixin(MinecraftServer.class)
12+
public class MinecraftServerMixin implements ITimeTrackingServer {
13+
private long mfix$lastTickStartTime = -1L;
14+
15+
@Override
16+
public long mfix$getLastTickStartTime() {
17+
return mfix$lastTickStartTime;
18+
}
19+
20+
@Inject(method = "runServer", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/MinecraftServer;tickServer(Ljava/util/function/BooleanSupplier;)V"))
21+
private void trackTickTime(CallbackInfo ci) {
22+
mfix$lastTickStartTime = Util.getMillis();
23+
}
24+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.embeddedt.modernfix.duck;
2+
3+
public interface ITimeTrackingServer {
4+
long mfix$getLastTickStartTime();
5+
}

common/src/main/java/org/embeddedt/modernfix/world/IntegratedWatchdog.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
import net.minecraft.DefaultUncaughtExceptionHandlerWithName;
55
import net.minecraft.Util;
66
import net.minecraft.server.MinecraftServer;
7+
import org.embeddedt.modernfix.duck.ITimeTrackingServer;
78
import org.slf4j.Logger;
89

910
import java.lang.ref.WeakReference;
11+
import java.util.OptionalLong;
1012

1113
public class IntegratedWatchdog extends Thread {
1214
private static final Logger LOGGER = LogUtils.getLogger();
@@ -22,23 +24,27 @@ public IntegratedWatchdog(MinecraftServer server) {
2224
this.setName("ModernFix integrated server watchdog");
2325
}
2426

27+
private OptionalLong getLastTickStart() {
28+
MinecraftServer server = this.server.get();
29+
if(server == null || !server.isRunning())
30+
return OptionalLong.empty();
31+
return OptionalLong.of(((ITimeTrackingServer)server).mfix$getLastTickStartTime());
32+
}
33+
2534
public void run() {
2635
while(true) {
27-
MinecraftServer server = this.server.get();
28-
if(server == null || !server.isRunning())
36+
OptionalLong lastTickStart = getLastTickStart();
37+
if(!lastTickStart.isPresent()) {
2938
return;
30-
long nextTick = server.getNextTickTime();
39+
}
3140
long curTime = Util.getMillis();
32-
long delta = curTime - nextTick;
41+
long delta = curTime - lastTickStart.getAsLong();
3342
if(delta > MAX_TICK_DELTA) {
3443
LOGGER.error("A single server tick has taken {}, more than {} milliseconds", delta, MAX_TICK_DELTA);
3544
LOGGER.error(ThreadDumper.obtainThreadDump());
36-
nextTick = 0;
37-
curTime = 0;
3845
}
39-
server = null; /* allow GC */
4046
try {
41-
Thread.sleep(nextTick + MAX_TICK_DELTA - curTime);
47+
Thread.sleep(MAX_TICK_DELTA - delta);
4248
} catch(InterruptedException ignored) {
4349
}
4450
}

0 commit comments

Comments
 (0)