From 867f165eb63df7218c79b6819610b69767d5e5a5 Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Sat, 15 Jun 2024 07:33:34 -0700 Subject: [PATCH] WIP changes from stream --- .../mixin/chunk_system/ChunkHolderMixin.java | 46 +++++++- .../mixin/chunk_system/ChunkMapMixin.java | 15 ++- .../chunk_system/DistanceManagerMixin.java | 27 +++++ .../GenerationChunkHolderMixin.java | 101 +++++++++++++++++- .../chunk_system/ServerChunkCacheMixin.java | 2 + .../ThreadedLevelLightEngineMixin.java | 9 ++ src/main/resources/moonrise.accesswidener | 12 ++- 7 files changed, 204 insertions(+), 8 deletions(-) diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ChunkHolderMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ChunkHolderMixin.java index 51b827f..f2548b2 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ChunkHolderMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ChunkHolderMixin.java @@ -7,7 +7,6 @@ import ca.spottedleaf.moonrise.patches.chunk_system.level.chunk.ChunkSystemChunk import ca.spottedleaf.moonrise.patches.chunk_system.scheduling.ChunkHolderManager; import ca.spottedleaf.moonrise.patches.chunk_system.scheduling.ChunkTaskScheduler; import ca.spottedleaf.moonrise.patches.chunk_system.scheduling.NewChunkHolder; -import com.mojang.datafixers.util.Pair; import net.minecraft.server.level.ChunkHolder; import net.minecraft.server.level.ChunkMap; import net.minecraft.server.level.ChunkResult; @@ -17,9 +16,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.TicketType; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ImposterProtoChunk; import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraft.world.level.chunk.status.ChunkStatus; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; @@ -41,6 +38,24 @@ public abstract class ChunkHolderMixin extends GenerationChunkHolder implements @Final private ChunkHolder.PlayerProvider playerProvider; + @Shadow + private volatile CompletableFuture> fullChunkFuture; + + @Shadow + private volatile CompletableFuture> tickingChunkFuture; + + @Shadow + private volatile CompletableFuture> entityTickingChunkFuture; + + @Shadow + private CompletableFuture pendingFullStateConfirmation; + + @Shadow + private CompletableFuture sendSync; + + @Shadow + private CompletableFuture saveSync; + public ChunkHolderMixin(ChunkPos chunkPos) { super(chunkPos); } @@ -120,6 +135,13 @@ public abstract class ChunkHolderMixin extends GenerationChunkHolder implements ) private void initFields(final CallbackInfo ci) { this.playersSentChunkTo = new ReferenceList<>(EMPTY_PLAYER_ARRAY, 0); + + this.fullChunkFuture = null; + this.tickingChunkFuture = null; + this.entityTickingChunkFuture = null; + this.pendingFullStateConfirmation = null; + this.sendSync = null; + this.saveSync = null; } /** @@ -234,6 +256,24 @@ public abstract class ChunkHolderMixin extends GenerationChunkHolder implements throw new UnsupportedOperationException(); } + /** + * @reason Chunk system is not built on futures anymore + * @author Spottedleaf + */ + @Overwrite + public boolean isReadyForSaving() { + throw new UnsupportedOperationException(); + } + + /** + * @reason Chunk system is not built on futures anymore + * @author Spottedleaf + */ + @Overwrite + public void addSaveDependency(final CompletableFuture completableFuture) { + throw new UnsupportedOperationException(); + } + /** * @reason need to reroute getTickingChunk to getChunkToSend, as we do not bring all sent chunks to ticking * @author Spottedleaf diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ChunkMapMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ChunkMapMixin.java index 0b67051..0e9a89b 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ChunkMapMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ChunkMapMixin.java @@ -10,7 +10,6 @@ import ca.spottedleaf.moonrise.patches.chunk_system.scheduling.NewChunkHolder; import com.mojang.datafixers.DataFixer; import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.StreamTagVisitor; import net.minecraft.server.level.ChunkGenerationTask; import net.minecraft.server.level.ChunkHolder; import net.minecraft.server.level.ChunkMap; @@ -29,7 +28,6 @@ import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.chunk.status.ChunkStep; -import net.minecraft.world.level.chunk.storage.ChunkScanAccess; import net.minecraft.world.level.chunk.storage.ChunkStorage; import net.minecraft.world.level.chunk.storage.RegionStorageInfo; import org.spongepowered.asm.mixin.Final; @@ -46,6 +44,7 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.Queue; import java.util.concurrent.CompletableFuture; import java.util.function.BooleanSupplier; import java.util.function.IntFunction; @@ -76,6 +75,15 @@ public abstract class ChunkMapMixin extends ChunkStorage implements ChunkHolder. @Shadow private int serverViewDistance; + @Shadow + private Long2ObjectLinkedOpenHashMap pendingUnloads; + + @Shadow + private List pendingGenerationTasks; + + @Shadow + private Queue unloadQueue; + public ChunkMapMixin(RegionStorageInfo regionStorageInfo, Path path, DataFixer dataFixer, boolean bl) { super(regionStorageInfo, path, dataFixer, bl); } @@ -94,9 +102,12 @@ public abstract class ChunkMapMixin extends ChunkStorage implements ChunkHolder. // intentionally destroy old chunk system hooks this.updatingChunkMap = null; this.visibleChunkMap = null; + this.pendingUnloads = null; this.queueSorter = null; this.worldgenMailbox = null; this.mainThreadMailbox = null; + this.pendingGenerationTasks = null; + this.unloadQueue = null; } /** diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/DistanceManagerMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/DistanceManagerMixin.java index 5d147ce..b7a115d 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/DistanceManagerMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/DistanceManagerMixin.java @@ -160,6 +160,15 @@ public abstract class DistanceManagerMixin implements ChunkSystemDistanceManager this.getChunkHolderManager().removeTicketAtLevel(type, pos, ChunkLevel.byStatus(FullChunkStatus.FULL) - radius, identifier); } + /** + * @reason Remove old chunk system hooks + * @author Spottedleaf + */ + @Overwrite + public SortedArraySet> getTickets(final long pos) { + throw new UnsupportedOperationException(); + } + /** * @reason Route to new chunk system * @author Spottedleaf @@ -324,6 +333,24 @@ public abstract class DistanceManagerMixin implements ChunkSystemDistanceManager return "No DistanceManager stats available"; } + /** + * @reason Remove old chunk system hooks + * @author Spottedleaf + */ + @Overwrite + public void dumpTickets(final String file) { + throw new UnsupportedOperationException(); + } + + /** + * @reason Remove old chunk system hooks + * @author Spottedleaf + */ + @Overwrite + public TickingTracker tickingTracker() { + throw new UnsupportedOperationException(); + } + /** * @reason This hack is not required anymore, see {@link MinecraftServerMixin} * @author Spottedleaf diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/GenerationChunkHolderMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/GenerationChunkHolderMixin.java index da13b46..976caee 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/GenerationChunkHolderMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/GenerationChunkHolderMixin.java @@ -1,7 +1,6 @@ package ca.spottedleaf.moonrise.mixin.chunk_system; import ca.spottedleaf.moonrise.patches.chunk_system.level.chunk.ChunkSystemChunkHolder; -import ca.spottedleaf.moonrise.patches.chunk_system.scheduling.ChunkTaskScheduler; import ca.spottedleaf.moonrise.patches.chunk_system.scheduling.NewChunkHolder; import com.mojang.datafixers.util.Pair; import net.minecraft.server.level.ChunkGenerationTask; @@ -19,8 +18,14 @@ import net.minecraft.world.level.chunk.status.ChunkStep; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.List; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.atomic.AtomicReferenceArray; @Mixin(GenerationChunkHolder.class) public abstract class GenerationChunkHolderMixin { @@ -28,6 +33,35 @@ public abstract class GenerationChunkHolderMixin { @Shadow public abstract int getTicketLevel(); + @Shadow + private AtomicReference startedWork; + + @Shadow + private AtomicReferenceArray>> futures; + + @Shadow + private AtomicReference task; + + @Shadow + private AtomicInteger generationRefCount; + + /** + * @reason Destroy old chunk system fields + * @author Spottedleaf + */ + @Inject( + method = "", + at = @At( + value = "RETURN" + ) + ) + private void init(final CallbackInfo ci) { + this.startedWork = null; + this.futures = null; + this.task = null; + this.generationRefCount = null; + } + /** * @reason Chunk system is not built on futures anymore * @author Spottedleaf @@ -71,7 +105,16 @@ public abstract class GenerationChunkHolderMixin { * @author Spottedleaf */ @Overwrite - public void removeTask(ChunkGenerationTask chunkGenerationTask) { + public void removeTask(final ChunkGenerationTask chunkGenerationTask) { + throw new UnsupportedOperationException(); + } + + /** + * @reason Chunk system is not built on futures anymore + * @author Spottedleaf + */ + @Overwrite + public void rescheduleChunkTask(final ChunkMap chunkMap, final ChunkStatus chunkStatus) { throw new UnsupportedOperationException(); } @@ -84,6 +127,60 @@ public abstract class GenerationChunkHolderMixin { throw new UnsupportedOperationException(); } + /** + * @reason Chunk system is not built on futures anymore + * @author Spottedleaf + */ + @Overwrite + public void failAndClearPendingFuturesBetween(final ChunkStatus from, final ChunkStatus to) { + throw new UnsupportedOperationException(); + } + + /** + * @reason Chunk system is not built on futures anymore + * @author Spottedleaf + */ + @Overwrite + public void failAndClearPendingFuture(final int idx, final CompletableFuture> expect) { + throw new UnsupportedOperationException(); + } + + /** + * @reason Chunk system is not built on futures anymore + * @author Spottedleaf + */ + @Overwrite + public void completeFuture(final ChunkStatus status, final ChunkAccess chunk) { + throw new UnsupportedOperationException(); + } + + /** + * @reason Chunk system is not built on futures anymore + * @author Spottedleaf + */ + @Overwrite + public ChunkStatus findHighestStatusWithPendingFuture(final ChunkStatus from) { + throw new UnsupportedOperationException(); + } + + /** + * @reason Chunk system is not built on futures anymore + * @author Spottedleaf + */ + @Overwrite + public boolean acquireStatusBump(final ChunkStatus chunkStatus) { + throw new UnsupportedOperationException(); + } + + /** + * @reason Chunk system is not built on futures anymore + * @author Spottedleaf + */ + @Overwrite + public boolean isStatusDisallowed(final ChunkStatus chunkStatus) { + throw new UnsupportedOperationException(); + } + /** * @reason Chunk system is not built on futures anymore * @author Spottedleaf diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ServerChunkCacheMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ServerChunkCacheMixin.java index b8cbca6..723af27 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ServerChunkCacheMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ServerChunkCacheMixin.java @@ -54,7 +54,9 @@ public abstract class ServerChunkCacheMixin extends ChunkSource { ); if (TickThread.isTickThreadFor(this.level, chunkX, chunkZ)) { + ChunkTaskScheduler.pushChunkWait(this.level, chunkX, chunkZ); this.mainThreadProcessor.managedBlock(completable::isDone); + ChunkTaskScheduler.popChunkWait(); } final ChunkAccess ret = completable.join(); diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/starlight/lightengine/ThreadedLevelLightEngineMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/starlight/lightengine/ThreadedLevelLightEngineMixin.java index bbdef64..d5b2aac 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/starlight/lightengine/ThreadedLevelLightEngineMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/starlight/lightengine/ThreadedLevelLightEngineMixin.java @@ -216,4 +216,13 @@ public abstract class ThreadedLevelLightEngineMixin extends LevelLightEngine imp public CompletableFuture lightChunk(final ChunkAccess chunk, final boolean lit) { throw new UnsupportedOperationException(); } + + /** + * @reason Destroy old chunk system hooks + * @author Spottedleaf + */ + @Overwrite + public CompletableFuture waitForPendingTasks(final int chunkX, final int chunkZ) { + throw new UnsupportedOperationException(); + } } diff --git a/src/main/resources/moonrise.accesswidener b/src/main/resources/moonrise.accesswidener index 2a1f942..c52b6ce 100644 --- a/src/main/resources/moonrise.accesswidener +++ b/src/main/resources/moonrise.accesswidener @@ -33,6 +33,9 @@ accessible method net/minecraft/server/level/ChunkMap getVisibleChunkIfPresent ( accessible method net/minecraft/server/level/ChunkMap getChunkQueueLevel (J)Ljava/util/function/IntSupplier; accessible method net/minecraft/server/level/ChunkMap generator ()Lnet/minecraft/world/level/chunk/ChunkGenerator; mutable field net/minecraft/server/level/ChunkMap updatingChunkMap Lit/unimi/dsi/fastutil/longs/Long2ObjectLinkedOpenHashMap; +mutable field net/minecraft/server/level/ChunkMap pendingUnloads Lit/unimi/dsi/fastutil/longs/Long2ObjectLinkedOpenHashMap; +mutable field net/minecraft/server/level/ChunkMap pendingGenerationTasks Ljava/util/List; +mutable field net/minecraft/server/level/ChunkMap unloadQueue Ljava/util/Queue; mutable field net/minecraft/server/level/ChunkMap queueSorter Lnet/minecraft/server/level/ChunkTaskPriorityQueueSorter; mutable field net/minecraft/server/level/ChunkMap worldgenMailbox Lnet/minecraft/util/thread/ProcessorHandle; mutable field net/minecraft/server/level/ChunkMap mainThreadMailbox Lnet/minecraft/util/thread/ProcessorHandle; @@ -253,4 +256,11 @@ accessible method net/minecraft/client/multiplayer/ClientLevel$EntityCallbacks < # StructureTemplate$Palette -mutable field net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate$Palette cache Ljava/util/Map; \ No newline at end of file +mutable field net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate$Palette cache Ljava/util/Map; + + +# GenerationChunkHolder +mutable field net/minecraft/server/level/GenerationChunkHolder startedWork Ljava/util/concurrent/atomic/AtomicReference; +mutable field net/minecraft/server/level/GenerationChunkHolder futures Ljava/util/concurrent/atomic/AtomicReferenceArray; +mutable field net/minecraft/server/level/GenerationChunkHolder task Ljava/util/concurrent/atomic/AtomicReference; +mutable field net/minecraft/server/level/GenerationChunkHolder generationRefCount Ljava/util/concurrent/atomic/AtomicInteger; \ No newline at end of file