From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: PureGero Date: Sun, 13 Feb 2022 14:02:25 +1000 Subject: [PATCH] Run tasks while reading chunk data Original license: GPLv3 Original project: https://github.com/MultiPaper/MultiPaper diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java index d7e941fe4224cdc18aaf56090fcc87e395464826..941bbf409043ec0deb64ee761c70bd0084ad7b78 100644 --- a/src/main/java/net/minecraft/server/level/ChunkMap.java +++ b/src/main/java/net/minecraft/server/level/ChunkMap.java @@ -1,6 +1,7 @@ package net.minecraft.server.level; import co.aikar.timings.Timing; // Paper +import com.destroystokyo.paper.io.PaperFileIOThread; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; import com.google.common.collect.Iterables; @@ -1717,9 +1718,17 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider @Override public CompoundTag readSync(ChunkPos chunkcoordintpair) throws IOException { if (Thread.currentThread() != com.destroystokyo.paper.io.PaperFileIOThread.Holder.INSTANCE) { - CompoundTag ret = com.destroystokyo.paper.io.PaperFileIOThread.Holder.INSTANCE - .loadChunkDataAsyncFuture(this.level, chunkcoordintpair.x, chunkcoordintpair.z, com.destroystokyo.paper.io.IOUtil.getPriorityForCurrentThread(), - false, true, true).join().chunkData; + // MultiPaper start - don't block the main thread, run tasks in the meantime + CompletableFuture completablefuture = com.destroystokyo.paper.io.PaperFileIOThread.Holder.INSTANCE + .loadChunkDataAsyncFuture(this.level, chunkcoordintpair.x, chunkcoordintpair.z, com.destroystokyo.paper.io.IOUtil.getPriorityForCurrentThread(), + false, true, true); + + if (!completablefuture.isDone()) { + level.chunkSource.mainThreadProcessor.managedBlock(completablefuture::isDone); + } + + CompoundTag ret = completablefuture.join().chunkData; + // MultiPaper end if (ret == com.destroystokyo.paper.io.PaperFileIOThread.FAILURE_VALUE) { throw new IOException("See logs for further detail");