9
0
mirror of https://github.com/Dreeam-qwq/Gale.git synced 2025-12-31 04:36:39 +00:00
Files
Gale/patches/server/0151-Yielding-memoized-Supplier.patch
2023-02-05 21:58:32 +01:00

428 lines
26 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Martijn Muijsers <martijnmuijsers@live.nl>
Date: Fri, 3 Feb 2023 23:17:33 +0100
Subject: [PATCH] Yielding memoized Supplier
License: AGPL-3.0 (https://www.gnu.org/licenses/agpl-3.0.html)
Gale - https://galemc.org
diff --git a/src/main/java/io/papermc/paper/configuration/PaperConfigurations.java b/src/main/java/io/papermc/paper/configuration/PaperConfigurations.java
index 47a3580caef45ffe71446c247d4e06e332b2fda2..0b7d6bdd9d0543a4b37abfdd67c9fda4688134de 100644
--- a/src/main/java/io/papermc/paper/configuration/PaperConfigurations.java
+++ b/src/main/java/io/papermc/paper/configuration/PaperConfigurations.java
@@ -41,6 +41,7 @@ import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import org.apache.commons.lang3.RandomStringUtils;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
+import org.galemc.gale.executor.lock.YieldingMemoizedSupplier;
import org.jetbrains.annotations.VisibleForTesting;
import org.slf4j.Logger;
import org.spigotmc.SpigotConfig;
@@ -127,7 +128,7 @@ public class PaperConfigurations extends Configurations<GlobalConfiguration, Wor
See https://docs.papermc.io/paper/configuration for more information.
""";
- public static final Supplier<SpigotWorldConfig> SPIGOT_WORLD_DEFAULTS = Suppliers.memoize(() -> new SpigotWorldConfig(RandomStringUtils.randomAlphabetic(255)) { // Gale - Gale configuration
+ public static final Supplier<SpigotWorldConfig> SPIGOT_WORLD_DEFAULTS = new YieldingMemoizedSupplier<>(() -> new SpigotWorldConfig(RandomStringUtils.randomAlphabetic(255)) { // Gale - Gale configuration, yielding memoized Supplier
@Override // override to ensure "verbose" is false
public void init() {
SpigotConfig.readConfig(SpigotWorldConfig.class, this);
diff --git a/src/main/java/io/papermc/paper/console/BrigadierCommandCompleter.java b/src/main/java/io/papermc/paper/console/BrigadierCommandCompleter.java
index 0627c98cae0b5ebdd71a849ae1299d7d3d581850..b0ea72d8a186a8e2758d0b2e3204cc81463085d4 100644
--- a/src/main/java/io/papermc/paper/console/BrigadierCommandCompleter.java
+++ b/src/main/java/io/papermc/paper/console/BrigadierCommandCompleter.java
@@ -15,6 +15,7 @@ import net.minecraft.commands.CommandSourceStack;
import net.minecraft.network.chat.ComponentUtils;
import net.minecraft.server.dedicated.DedicatedServer;
import org.checkerframework.checker.nullness.qual.NonNull;
+import org.galemc.gale.executor.lock.YieldingMemoizedSupplier;
import org.jline.reader.Candidate;
import org.jline.reader.LineReader;
import org.jline.reader.ParsedLine;
@@ -27,7 +28,7 @@ public final class BrigadierCommandCompleter {
public BrigadierCommandCompleter(final @NonNull DedicatedServer server) {
this.server = server;
- this.commandSourceStack = Suppliers.memoize(this.server::createCommandSourceStack);
+ this.commandSourceStack = new YieldingMemoizedSupplier<>(this.server::createCommandSourceStack); // Gale - yielding memoized Supplier
}
public void complete(final @NonNull LineReader reader, final @NonNull ParsedLine line, final @NonNull List<Candidate> candidates, final @NonNull List<Completion> existing) {
diff --git a/src/main/java/io/papermc/paper/console/BrigadierCommandHighlighter.java b/src/main/java/io/papermc/paper/console/BrigadierCommandHighlighter.java
index dd9d77d7c7f1a5a130a1f4c15e5b1e68ae3753e1..c3661b25ae8b4dc5e9d7e9bb0e14f6d2b314f309 100644
--- a/src/main/java/io/papermc/paper/console/BrigadierCommandHighlighter.java
+++ b/src/main/java/io/papermc/paper/console/BrigadierCommandHighlighter.java
@@ -9,6 +9,7 @@ import java.util.regex.Pattern;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.server.dedicated.DedicatedServer;
import org.checkerframework.checker.nullness.qual.NonNull;
+import org.galemc.gale.executor.lock.YieldingMemoizedSupplier;
import org.jline.reader.Highlighter;
import org.jline.reader.LineReader;
import org.jline.utils.AttributedString;
@@ -22,7 +23,7 @@ public final class BrigadierCommandHighlighter implements Highlighter {
public BrigadierCommandHighlighter(final @NonNull DedicatedServer server) {
this.server = server;
- this.commandSourceStack = Suppliers.memoize(this.server::createCommandSourceStack);
+ this.commandSourceStack = new YieldingMemoizedSupplier<>(this.server::createCommandSourceStack); // Gale - yielding memoized Supplier
}
@Override
diff --git a/src/main/java/io/papermc/paper/registry/PaperRegistry.java b/src/main/java/io/papermc/paper/registry/PaperRegistry.java
index 7c265d27da034986be73921d35bf08ae250b42f3..89c4b9e4feb6e7720efbb91cf8ba380a89f34d6e 100644
--- a/src/main/java/io/papermc/paper/registry/PaperRegistry.java
+++ b/src/main/java/io/papermc/paper/registry/PaperRegistry.java
@@ -14,6 +14,7 @@ import org.bukkit.craftbukkit.util.CraftNamespacedKey;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.checkerframework.framework.qual.DefaultQualifier;
+import org.galemc.gale.executor.lock.YieldingMemoizedSupplier;
import java.util.Collections;
import java.util.HashMap;
@@ -29,7 +30,7 @@ import java.util.function.Supplier;
public abstract class PaperRegistry<API extends Keyed, MINECRAFT> implements org.bukkit.Registry<API> {
@SuppressWarnings("FieldMayBeFinal") // non-final for testing
- private static Supplier<RegistryAccess> REGISTRY_ACCESS = Suppliers.memoize(() -> MinecraftServer.getServer().registryAccess());
+ private static Supplier<RegistryAccess> REGISTRY_ACCESS = new YieldingMemoizedSupplier<>(() -> MinecraftServer.getServer().registryAccess()); // Gale - yielding memoized Supplier
private static final Map<RegistryKey<?, ?>, PaperRegistry<?, ?>> INTERNAL_REGISTRIES = new HashMap<>();
public static final Map<RegistryKey<?, ?>, PaperRegistry<?, ?>> REGISTRIES = Collections.unmodifiableMap(INTERNAL_REGISTRIES);
private static final Map<Class<?>, PaperRegistry<?, ?>> REGISTRY_BY_API_CLASS = new HashMap<>();
@@ -43,7 +44,7 @@ public abstract class PaperRegistry<API extends Keyed, MINECRAFT> implements org
public PaperRegistry(RegistryKey<API, MINECRAFT> registryKey) {
this.registryKey = registryKey;
- this.registry = Suppliers.memoize(() -> REGISTRY_ACCESS.get().registryOrThrow(this.registryKey.resourceKey()));
+ this.registry = new YieldingMemoizedSupplier<>(() -> REGISTRY_ACCESS.get().registryOrThrow(this.registryKey.resourceKey())); // Gale - yielding memoized Supplier
}
@Override
@@ -138,7 +139,7 @@ public abstract class PaperRegistry<API extends Keyed, MINECRAFT> implements org
}
protected static <T> Supplier<Registry<T>> registryFor(ResourceKey<? extends Registry<T>> registryKey) {
- return Suppliers.memoize(() -> REGISTRY_ACCESS.get().registryOrThrow(registryKey));
+ return new YieldingMemoizedSupplier<>(() -> REGISTRY_ACCESS.get().registryOrThrow(registryKey)); // Gale - yielding memoized Supplier
}
public static void clearCaches() {
diff --git a/src/main/java/net/minecraft/util/ExtraCodecs.java b/src/main/java/net/minecraft/util/ExtraCodecs.java
index 7591002e07271389f9ac8decea25747c0cd8a213..506e8b0b06aca455ea608b6cee2292f120ae5e90 100644
--- a/src/main/java/net/minecraft/util/ExtraCodecs.java
+++ b/src/main/java/net/minecraft/util/ExtraCodecs.java
@@ -1,7 +1,6 @@
package net.minecraft.util;
import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableList;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
@@ -47,6 +46,7 @@ import net.minecraft.core.UUIDUtil;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import org.apache.commons.lang3.mutable.MutableObject;
+import org.galemc.gale.executor.lock.YieldingMemoizedSupplier;
import org.joml.Vector3f;
public class ExtraCodecs {
@@ -459,7 +459,7 @@ public class ExtraCodecs {
static record LazyInitializedCodec<A>(Supplier<Codec<A>> delegate) implements Codec<A> {
LazyInitializedCodec {
- delegate = Suppliers.memoize(delegate::get); // Gale - dev import deobfuscation fixes
+ delegate = new YieldingMemoizedSupplier<>(delegate::get); // Gale - dev import deobfuscation fixes, yielding memoized Supplier
}
public <T> DataResult<Pair<A, T>> decode(DynamicOps<T> dynamicOps, T object) {
diff --git a/src/main/java/net/minecraft/util/LazyLoadedValue.java b/src/main/java/net/minecraft/util/LazyLoadedValue.java
index 906d4bca809fe2ae6b45e7212be8547b81422b01..3ceff89ef71768826be1156538dc70f25d68488a 100644
--- a/src/main/java/net/minecraft/util/LazyLoadedValue.java
+++ b/src/main/java/net/minecraft/util/LazyLoadedValue.java
@@ -1,6 +1,7 @@
package net.minecraft.util;
-import com.google.common.base.Suppliers;
+import org.galemc.gale.executor.lock.YieldingMemoizedSupplier;
+
import java.util.function.Supplier;
/** @deprecated */
@@ -9,7 +10,7 @@ public class LazyLoadedValue<T> {
private final Supplier<T> factory;
public LazyLoadedValue(Supplier<T> delegate) {
- this.factory = Suppliers.memoize(delegate::get);
+ this.factory = new YieldingMemoizedSupplier<>(delegate); // Gale - yielding memoized Supplier
}
public T get() {
diff --git a/src/main/java/net/minecraft/util/datafix/fixes/ChunkProtoTickListFix.java b/src/main/java/net/minecraft/util/datafix/fixes/ChunkProtoTickListFix.java
index d6de68b4b0edabf37ba551b91bbe6682895b2a82..b4cf65c1b84a4ebcf4a362ec614f5fd7a585ab2e 100644
--- a/src/main/java/net/minecraft/util/datafix/fixes/ChunkProtoTickListFix.java
+++ b/src/main/java/net/minecraft/util/datafix/fixes/ChunkProtoTickListFix.java
@@ -1,6 +1,5 @@
package net.minecraft.util.datafix.fixes;
-import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.mojang.datafixers.DSL;
@@ -24,6 +23,7 @@ import java.util.function.Supplier;
import java.util.stream.Stream;
import javax.annotation.Nullable;
import org.apache.commons.lang3.mutable.MutableInt;
+import org.galemc.gale.executor.lock.YieldingMemoizedSupplier;
public class ChunkProtoTickListFix extends DataFix {
private static final int SECTION_WIDTH = 16;
@@ -64,7 +64,7 @@ public class ChunkProtoTickListFix extends DataFix {
}
typedx2.getOptionalTyped(opticFinder4).ifPresent((typed3) -> { // Gale - dev import deobfuscation fixes
- int2ObjectMap.put(i, Suppliers.memoize(() -> {
+ int2ObjectMap.put(i, new YieldingMemoizedSupplier<>(() -> { // Gale - yielding memoized Supplier
// Gale start - dev import deobfuscation fixes
List<? extends Dynamic<?>> list = typed.getOptionalTyped(opticFinder6).map((typedx3) -> {
return typedx3.write().result().map((dynamic3) -> {
diff --git a/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java b/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java
index 95ba37458e8154dbce6a8590508840d694fcbed1..24af3be284d5ed693ec932e53935a777d0a8d266 100644
--- a/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java
+++ b/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java
@@ -33,6 +33,7 @@ import net.minecraft.world.flag.FeatureFlagSet;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
+import org.galemc.gale.executor.lock.YieldingMemoizedSupplier;
import org.slf4j.Logger;
// CraftBukkit start
@@ -238,7 +239,7 @@ public abstract class AbstractContainerMenu {
ItemStack itemstack = ((Slot) this.slots.get(i)).getItem();
Objects.requireNonNull(itemstack);
- Supplier<ItemStack> supplier = Suppliers.memoize(itemstack::copy);
+ Supplier<ItemStack> supplier = new YieldingMemoizedSupplier<>(itemstack::copy); // Gale - yielding memoized Supplier
this.triggerSlotListeners(i, itemstack, supplier);
this.synchronizeSlotToRemote(i, itemstack, supplier);
diff --git a/src/main/java/net/minecraft/world/item/HoneycombItem.java b/src/main/java/net/minecraft/world/item/HoneycombItem.java
index 1f8b7b50c6aa24778d87821ae2ff4d019d176082..d63da08e75e25860e5ae54674d32f5b3ff421e22 100644
--- a/src/main/java/net/minecraft/world/item/HoneycombItem.java
+++ b/src/main/java/net/minecraft/world/item/HoneycombItem.java
@@ -16,12 +16,13 @@ import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.gameevent.GameEvent;
+import org.galemc.gale.executor.lock.YieldingMemoizedSupplier;
public class HoneycombItem extends Item {
- public static final Supplier<BiMap<Block, Block>> WAXABLES = Suppliers.memoize(() -> {
+ public static final Supplier<BiMap<Block, Block>> WAXABLES = new YieldingMemoizedSupplier<>(() -> { // Gale - yielding memoized Supplier
return ImmutableBiMap.<Block, Block>builder().put(Blocks.COPPER_BLOCK, Blocks.WAXED_COPPER_BLOCK).put(Blocks.EXPOSED_COPPER, Blocks.WAXED_EXPOSED_COPPER).put(Blocks.WEATHERED_COPPER, Blocks.WAXED_WEATHERED_COPPER).put(Blocks.OXIDIZED_COPPER, Blocks.WAXED_OXIDIZED_COPPER).put(Blocks.CUT_COPPER, Blocks.WAXED_CUT_COPPER).put(Blocks.EXPOSED_CUT_COPPER, Blocks.WAXED_EXPOSED_CUT_COPPER).put(Blocks.WEATHERED_CUT_COPPER, Blocks.WAXED_WEATHERED_CUT_COPPER).put(Blocks.OXIDIZED_CUT_COPPER, Blocks.WAXED_OXIDIZED_CUT_COPPER).put(Blocks.CUT_COPPER_SLAB, Blocks.WAXED_CUT_COPPER_SLAB).put(Blocks.EXPOSED_CUT_COPPER_SLAB, Blocks.WAXED_EXPOSED_CUT_COPPER_SLAB).put(Blocks.WEATHERED_CUT_COPPER_SLAB, Blocks.WAXED_WEATHERED_CUT_COPPER_SLAB).put(Blocks.OXIDIZED_CUT_COPPER_SLAB, Blocks.WAXED_OXIDIZED_CUT_COPPER_SLAB).put(Blocks.CUT_COPPER_STAIRS, Blocks.WAXED_CUT_COPPER_STAIRS).put(Blocks.EXPOSED_CUT_COPPER_STAIRS, Blocks.WAXED_EXPOSED_CUT_COPPER_STAIRS).put(Blocks.WEATHERED_CUT_COPPER_STAIRS, Blocks.WAXED_WEATHERED_CUT_COPPER_STAIRS).put(Blocks.OXIDIZED_CUT_COPPER_STAIRS, Blocks.WAXED_OXIDIZED_CUT_COPPER_STAIRS).build();
});
- public static final Supplier<BiMap<Block, Block>> WAX_OFF_BY_BLOCK = Suppliers.memoize(() -> {
+ public static final Supplier<BiMap<Block, Block>> WAX_OFF_BY_BLOCK = new YieldingMemoizedSupplier<>(() -> { // Gale - yielding memoized Supplier
return WAXABLES.get().inverse();
});
diff --git a/src/main/java/net/minecraft/world/level/PathNavigationRegion.java b/src/main/java/net/minecraft/world/level/PathNavigationRegion.java
index efe922810507c96183a56a5e81a7b14214d8747b..b87c9a6189161e776fa488c1ac6215edca596184 100644
--- a/src/main/java/net/minecraft/world/level/PathNavigationRegion.java
+++ b/src/main/java/net/minecraft/world/level/PathNavigationRegion.java
@@ -24,6 +24,7 @@ import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.material.Fluids;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.shapes.VoxelShape;
+import org.galemc.gale.executor.lock.YieldingMemoizedSupplier;
public class PathNavigationRegion implements BlockGetter, CollisionGetter {
protected final int centerX;
@@ -35,7 +36,7 @@ public class PathNavigationRegion implements BlockGetter, CollisionGetter {
public PathNavigationRegion(Level world, BlockPos minPos, BlockPos maxPos) {
this.level = world;
- this.plains = Suppliers.memoize(() -> {
+ this.plains = new YieldingMemoizedSupplier<>(() -> { // Gale - yielding memoized Supplier
return world.registryAccess().registryOrThrow(Registries.BIOME).getHolderOrThrow(Biomes.PLAINS);
});
this.centerX = SectionPos.blockToSectionCoord(minPos.getX());
diff --git a/src/main/java/net/minecraft/world/level/biome/BiomeGenerationSettings.java b/src/main/java/net/minecraft/world/level/biome/BiomeGenerationSettings.java
index 3f9628ec396a11ffd49270be7996d13f606366b6..3f7e8bb767ba4e886549cf487a20f62c3519012a 100644
--- a/src/main/java/net/minecraft/world/level/biome/BiomeGenerationSettings.java
+++ b/src/main/java/net/minecraft/world/level/biome/BiomeGenerationSettings.java
@@ -26,6 +26,7 @@ import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.level.levelgen.feature.Feature;
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
+import org.galemc.gale.executor.lock.YieldingMemoizedSupplier;
import org.slf4j.Logger;
public class BiomeGenerationSettings {
@@ -46,12 +47,12 @@ public class BiomeGenerationSettings {
BiomeGenerationSettings(Map<GenerationStep.Carving, HolderSet<ConfiguredWorldCarver<?>>> carvers, List<HolderSet<PlacedFeature>> features) {
this.carvers = carvers;
this.features = features;
- this.flowerFeatures = Suppliers.memoize(() -> {
+ this.flowerFeatures = new YieldingMemoizedSupplier<>(() -> { // Gale - yielding memoized Supplier
return features.stream().flatMap(HolderSet::stream).map(Holder::value).flatMap(PlacedFeature::getFeatures).filter((feature) -> {
return feature.feature() == Feature.FLOWER;
}).collect(ImmutableList.toImmutableList());
});
- this.featureSet = Suppliers.memoize(() -> {
+ this.featureSet = new YieldingMemoizedSupplier<>(() -> { // Gale - yielding memoized Supplier
return features.stream().flatMap(HolderSet::stream).map(Holder::value).collect(Collectors.toSet());
});
}
diff --git a/src/main/java/net/minecraft/world/level/block/WeatheringCopper.java b/src/main/java/net/minecraft/world/level/block/WeatheringCopper.java
index 16bd93606ac4a9c34108a92dd4b98cb4600221d9..f4aeb2a4cafe7fe0782660c0e7fd94ae216a8940 100644
--- a/src/main/java/net/minecraft/world/level/block/WeatheringCopper.java
+++ b/src/main/java/net/minecraft/world/level/block/WeatheringCopper.java
@@ -6,12 +6,13 @@ import com.google.common.collect.ImmutableBiMap;
import java.util.Optional;
import java.util.function.Supplier;
import net.minecraft.world.level.block.state.BlockState;
+import org.galemc.gale.executor.lock.YieldingMemoizedSupplier;
public interface WeatheringCopper extends ChangeOverTimeBlock<WeatheringCopper.WeatherState> {
- Supplier<BiMap<Block, Block>> NEXT_BY_BLOCK = Suppliers.memoize(() -> {
+ Supplier<BiMap<Block, Block>> NEXT_BY_BLOCK = new YieldingMemoizedSupplier<>(() -> { // Gale - yielding memoized Supplier
return ImmutableBiMap.<Block, Block>builder().put(Blocks.COPPER_BLOCK, Blocks.EXPOSED_COPPER).put(Blocks.EXPOSED_COPPER, Blocks.WEATHERED_COPPER).put(Blocks.WEATHERED_COPPER, Blocks.OXIDIZED_COPPER).put(Blocks.CUT_COPPER, Blocks.EXPOSED_CUT_COPPER).put(Blocks.EXPOSED_CUT_COPPER, Blocks.WEATHERED_CUT_COPPER).put(Blocks.WEATHERED_CUT_COPPER, Blocks.OXIDIZED_CUT_COPPER).put(Blocks.CUT_COPPER_SLAB, Blocks.EXPOSED_CUT_COPPER_SLAB).put(Blocks.EXPOSED_CUT_COPPER_SLAB, Blocks.WEATHERED_CUT_COPPER_SLAB).put(Blocks.WEATHERED_CUT_COPPER_SLAB, Blocks.OXIDIZED_CUT_COPPER_SLAB).put(Blocks.CUT_COPPER_STAIRS, Blocks.EXPOSED_CUT_COPPER_STAIRS).put(Blocks.EXPOSED_CUT_COPPER_STAIRS, Blocks.WEATHERED_CUT_COPPER_STAIRS).put(Blocks.WEATHERED_CUT_COPPER_STAIRS, Blocks.OXIDIZED_CUT_COPPER_STAIRS).build();
});
- Supplier<BiMap<Block, Block>> PREVIOUS_BY_BLOCK = Suppliers.memoize(() -> {
+ Supplier<BiMap<Block, Block>> PREVIOUS_BY_BLOCK = new YieldingMemoizedSupplier<>(() -> { // Gale - yielding memoized Supplier
return NEXT_BY_BLOCK.get().inverse();
});
diff --git a/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java b/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java
index 7e9c388179c75a233d9b179ea1e00428ac65ee99..9f0a04b8aad7dc14f87dc48b70968b55d84951b8 100644
--- a/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java
+++ b/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java
@@ -76,6 +76,7 @@ import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadStruct
import net.minecraft.world.level.levelgen.structure.placement.StructurePlacement;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager;
import org.apache.commons.lang3.mutable.MutableBoolean;
+import org.galemc.gale.executor.lock.YieldingMemoizedSupplier;
public abstract class ChunkGenerator {
@@ -93,7 +94,7 @@ public abstract class ChunkGenerator {
public ChunkGenerator(BiomeSource biomeSource, Function<Holder<Biome>, BiomeGenerationSettings> generationSettingsGetter) {
this.biomeSource = biomeSource;
this.generationSettingsGetter = generationSettingsGetter;
- this.featuresPerStep = Suppliers.memoize(() -> {
+ this.featuresPerStep = new YieldingMemoizedSupplier<>(() -> { // Gale - yielding memoized Supplier
return FeatureSorter.buildFeaturesPerStep(List.copyOf(biomeSource.possibleBiomes()), (holder) -> {
return ((BiomeGenerationSettings) generationSettingsGetter.apply(holder)).features();
}, true);
diff --git a/src/main/java/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java b/src/main/java/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java
index 6c93e621d584927076b886c719e93039019e32be..4b8bf8f150030c014ccff1290d0b996441a29adf 100644
--- a/src/main/java/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java
+++ b/src/main/java/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java
@@ -49,6 +49,7 @@ import net.minecraft.world.level.levelgen.blending.Blender;
import net.minecraft.world.level.levelgen.carver.CarvingContext;
import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver;
import org.apache.commons.lang3.mutable.MutableObject;
+import org.galemc.gale.executor.lock.YieldingMemoizedSupplier;
public final class NoiseBasedChunkGenerator extends ChunkGenerator {
@@ -67,7 +68,7 @@ public final class NoiseBasedChunkGenerator extends ChunkGenerator {
public NoiseBasedChunkGenerator(BiomeSource biomeSource, Holder<NoiseGeneratorSettings> settings) {
super(biomeSource);
this.settings = settings;
- this.globalFluidPicker = Suppliers.memoize(() -> {
+ this.globalFluidPicker = new YieldingMemoizedSupplier<>(() -> { // Gale - yielding memoized Supplier
// Gale start - Lithium - cache world generator sea level
var fluidPicker = NoiseBasedChunkGenerator.createFluidPicker((NoiseGeneratorSettings) settings.value());
this.cachedSeaLevel = settings.value().seaLevel();
diff --git a/src/main/java/net/minecraft/world/level/levelgen/SurfaceRules.java b/src/main/java/net/minecraft/world/level/levelgen/SurfaceRules.java
index 45b0706a48c4bf44923a2590f34913b7373de8f4..5990287d2ffaa32accb2444d6627ed29dc65d60d 100644
--- a/src/main/java/net/minecraft/world/level/levelgen/SurfaceRules.java
+++ b/src/main/java/net/minecraft/world/level/levelgen/SurfaceRules.java
@@ -28,6 +28,7 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.level.levelgen.placement.CaveSurface;
import net.minecraft.world.level.levelgen.synth.NormalNoise;
+import org.galemc.gale.executor.lock.YieldingMemoizedSupplier;
public class SurfaceRules {
public static final SurfaceRules.ConditionSource ON_FLOOR = stoneDepthCheck(0, false, CaveSurface.FLOOR);
@@ -310,7 +311,7 @@ public class SurfaceRules {
protected void updateY(int stoneDepthAbove, int stoneDepthBelow, int fluidHeight, int blockX, int blockY, int blockZ) {
++this.lastUpdateY;
- this.biome = Suppliers.memoize(() -> {
+ this.biome = new YieldingMemoizedSupplier<>(() -> { // Gale - yielding memoized Supplier
return this.biomeGetter.apply(this.pos.set(blockX, blockY, blockZ));
});
this.blockY = blockY;
diff --git a/src/main/java/org/galemc/gale/executor/lock/YieldingMemoizedSupplier.java b/src/main/java/org/galemc/gale/executor/lock/YieldingMemoizedSupplier.java
new file mode 100644
index 0000000000000000000000000000000000000000..8732ea0a07a88117e0e6a2fe073a48bad4ff8b19
--- /dev/null
+++ b/src/main/java/org/galemc/gale/executor/lock/YieldingMemoizedSupplier.java
@@ -0,0 +1,60 @@
+// Gale - yielding memoized Supplier
+
+package org.galemc.gale.executor.lock;
+
+import com.google.common.base.Suppliers;
+import org.galemc.gale.concurrent.Mutex;
+import org.galemc.gale.concurrent.ThreadAwareNonReentrantLock;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.function.Supplier;
+
+/**
+ * A replacement for {@link Suppliers#memoize} that provides thread-safety
+ * with a {@link YieldingLock} instead of by a <code>synchronized</code> block.
+ * <br>
+ * The {@link #get()} method of this supplier must not be reachable from the body of the original supplier.
+ * To assure this, the lock used internally is a {@link ThreadAwareNonReentrantLock}.
+ * <br>
+ * The original {@link Supplier} will be de-referenced once the value has been provided once,
+ * so that it may be garbage collected.
+ */
+public class YieldingMemoizedSupplier<T extends @Nullable Object> implements Supplier<T> {
+
+ private volatile @Nullable Supplier<T> delegate;
+ private volatile boolean initialized;
+ @Nullable T value;
+ private final YieldingLock lock = new MultipleWaitingBaseThreadsYieldingLock(new ThreadAwareNonReentrantLock(Mutex.createLock()));
+
+ public YieldingMemoizedSupplier(Supplier<T> delegate) {
+ this.delegate = delegate;
+ }
+
+ @Override
+ public T get() {
+ if (!this.initialized) {
+ this.lock.lock();
+ try {
+ if (!this.initialized) {
+ T t = this.delegate.get();
+ this.value = t;
+ this.initialized = true;
+ this.delegate = null;
+ return t;
+ }
+ } finally {
+ this.lock.unlock();
+ }
+ }
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ var delegate = this.delegate;
+ return this.getClass().getSimpleName() + "("
+ + (delegate == null ? "<supplier that returned " + this.value + ">" : delegate)
+ + ")";
+ }
+
+}