Fix dead lock when jumping backwards in time during rendering
A jump backwards in time entails unloading the current world and with it the ChunkRenderDispatcher that the ChunkLoadingRenderGlobal has locked.
This commit is contained in:
@@ -22,15 +22,30 @@ import static com.replaymod.core.versions.MCVer.*;
|
|||||||
public class ChunkLoadingRenderGlobal {
|
public class ChunkLoadingRenderGlobal {
|
||||||
|
|
||||||
private final RenderGlobal hooked;
|
private final RenderGlobal hooked;
|
||||||
private final ChunkRenderDispatcher renderDispatcher;
|
private ChunkRenderDispatcher renderDispatcher;
|
||||||
private final JailingQueue<ChunkCompileTaskGenerator> workerJailingQueue;
|
private JailingQueue<ChunkCompileTaskGenerator> workerJailingQueue;
|
||||||
private final CustomChunkRenderWorker renderWorker;
|
private CustomChunkRenderWorker renderWorker;
|
||||||
private int frame;
|
private int frame;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public ChunkLoadingRenderGlobal(RenderGlobal renderGlobal) {
|
public ChunkLoadingRenderGlobal(RenderGlobal renderGlobal) {
|
||||||
this.hooked = renderGlobal;
|
this.hooked = renderGlobal;
|
||||||
this.renderDispatcher = renderGlobal.renderDispatcher;
|
|
||||||
|
setup(renderGlobal.renderDispatcher);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateRenderDispatcher(ChunkRenderDispatcher renderDispatcher) {
|
||||||
|
if (this.renderDispatcher != null) {
|
||||||
|
workerJailingQueue.freeAll();
|
||||||
|
this.renderDispatcher = null;
|
||||||
|
}
|
||||||
|
if (renderDispatcher != null) {
|
||||||
|
setup(renderDispatcher);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setup(ChunkRenderDispatcher renderDispatcher) {
|
||||||
|
this.renderDispatcher = renderDispatcher;
|
||||||
this.renderWorker = new CustomChunkRenderWorker(renderDispatcher, new RegionRenderCacheBuilder());
|
this.renderWorker = new CustomChunkRenderWorker(renderDispatcher, new RegionRenderCacheBuilder());
|
||||||
|
|
||||||
int workerThreads = renderDispatcher.listThreadedWorkers.size();
|
int workerThreads = renderDispatcher.listThreadedWorkers.size();
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import org.spongepowered.asm.mixin.Mixin;
|
|||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
//#if MC<10904
|
//#if MC<10904
|
||||||
@@ -66,4 +67,18 @@ public abstract class MixinRenderGlobal {
|
|||||||
ci.cancel();
|
ci.cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject(method = "setWorldAndLoadRenderers", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/chunk/ChunkRenderDispatcher;stopWorkerThreads()V"))
|
||||||
|
private void stopWorkerThreadsAndChunkLoadingRenderGlobal(CallbackInfo ci) {
|
||||||
|
if (replayModRender_hook != null) {
|
||||||
|
replayModRender_hook.updateRenderDispatcher(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(method = "loadRenderers", at = @At(value = "RETURN"))
|
||||||
|
private void setupChunkLoadingRenderGlobal(CallbackInfo ci) {
|
||||||
|
if (replayModRender_hook != null) {
|
||||||
|
replayModRender_hook.updateRenderDispatcher(renderDispatcher);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user