Fix worldgen async catcher deadlock
This commit is contained in:
parent
c050ec7f6b
commit
9d27ae8627
@ -18,5 +18,7 @@ public interface MinecraftServerBridge {
|
|||||||
|
|
||||||
void bridge$queuedProcess(Runnable runnable);
|
void bridge$queuedProcess(Runnable runnable);
|
||||||
|
|
||||||
|
void bridge$drainQueuedTasks();
|
||||||
|
|
||||||
boolean bridge$hasStopped();
|
boolean bridge$hasStopped();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -296,10 +296,15 @@ public abstract class MinecraftServerMixin extends RecursiveEventLoop<TickDelaye
|
|||||||
|
|
||||||
private void executeModerately() {
|
private void executeModerately() {
|
||||||
this.drainTasks();
|
this.drainTasks();
|
||||||
|
this.bridge$drainQueuedTasks();
|
||||||
|
java.util.concurrent.locks.LockSupport.parkNanos("executing tasks", 1000L);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void bridge$drainQueuedTasks() {
|
||||||
while (!processQueue.isEmpty()) {
|
while (!processQueue.isEmpty()) {
|
||||||
processQueue.remove().run();
|
processQueue.remove().run();
|
||||||
}
|
}
|
||||||
java.util.concurrent.locks.LockSupport.parkNanos("executing tasks", 1000L);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "isAheadOfTime", cancellable = true, at = @At("HEAD"))
|
@Inject(method = "isAheadOfTime", cancellable = true, at = @At("HEAD"))
|
||||||
@ -445,9 +450,7 @@ public abstract class MinecraftServerMixin extends RecursiveEventLoop<TickDelaye
|
|||||||
public void arclight$runScheduler(BooleanSupplier hasTimeLeft, CallbackInfo ci) {
|
public void arclight$runScheduler(BooleanSupplier hasTimeLeft, CallbackInfo ci) {
|
||||||
ArclightConstants.currentTick = (int) (System.currentTimeMillis() / 50);
|
ArclightConstants.currentTick = (int) (System.currentTimeMillis() / 50);
|
||||||
this.server.getScheduler().mainThreadHeartbeat(this.tickCounter);
|
this.server.getScheduler().mainThreadHeartbeat(this.tickCounter);
|
||||||
while (!processQueue.isEmpty()) {
|
this.bridge$drainQueuedTasks();
|
||||||
processQueue.remove().run();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -1,7 +1,9 @@
|
|||||||
package io.izzel.arclight.common.mixin.core.world.server;
|
package io.izzel.arclight.common.mixin.core.world.server;
|
||||||
|
|
||||||
|
import io.izzel.arclight.common.bridge.server.MinecraftServerBridge;
|
||||||
import io.izzel.arclight.common.bridge.world.server.ChunkManagerBridge;
|
import io.izzel.arclight.common.bridge.world.server.ChunkManagerBridge;
|
||||||
import io.izzel.arclight.common.bridge.world.server.ServerChunkProviderBridge;
|
import io.izzel.arclight.common.bridge.world.server.ServerChunkProviderBridge;
|
||||||
|
import io.izzel.arclight.common.mod.server.ArclightServer;
|
||||||
import net.minecraft.util.concurrent.ThreadTaskExecutor;
|
import net.minecraft.util.concurrent.ThreadTaskExecutor;
|
||||||
import net.minecraft.world.server.ServerChunkProvider;
|
import net.minecraft.world.server.ServerChunkProvider;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
@ -35,6 +37,7 @@ public abstract class ServerChunkProvider_ChunkExecutorMixin extends ThreadTaskE
|
|||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
((ChunkManagerBridge) outer.chunkManager).bridge$getCallbackExecutor().run();
|
((ChunkManagerBridge) outer.chunkManager).bridge$getCallbackExecutor().run();
|
||||||
|
((MinecraftServerBridge) ArclightServer.getMinecraftServer()).bridge$drainQueuedTasks();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user