diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index 1eaa468e3..1f84d5b09 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -36,6 +36,7 @@ import com.volmit.iris.util.Desc; import com.volmit.iris.util.Form; import com.volmit.iris.util.GroupedExecutor; import com.volmit.iris.util.IO; +import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.IrisPostBlockFilter; import com.volmit.iris.util.J; import com.volmit.iris.util.JSONException; @@ -64,6 +65,7 @@ public class Iris extends MortarPlugin implements BoardProvider private KList lines = new KList<>(); public RollingSequence hits = new RollingSequence(20); public RollingSequence tp = new RollingSequence(100); + private static IrisLock lock = new IrisLock("Iris"); public static KList> postProcessors; @Permission @@ -97,6 +99,7 @@ public class Iris extends MortarPlugin implements BoardProvider public void onEnable() { + lock = new IrisLock("Iris"); instance = this; hotloader = new IrisHotloadManager(); data = new IrisDataManager(getDataFolder()); @@ -122,6 +125,7 @@ public class Iris extends MortarPlugin implements BoardProvider public void onDisable() { + lock.unlock(); proj.close(); for(GroupedExecutor i : executors) @@ -280,16 +284,18 @@ public class Iris extends MortarPlugin implements BoardProvider public static void msg(String string) { + lock.lock(); String msg = ChatColor.GREEN + "[Iris]: " + ChatColor.GRAY + string; if(last.equals(msg)) { + lock.unlock(); return; } last = msg; - - Bukkit.getConsoleSender().sendMessage(msg); + Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () -> Bukkit.getConsoleSender().sendMessage(msg)); + lock.unlock(); } public static void warn(String string) diff --git a/src/main/java/com/volmit/iris/IrisSettings.java b/src/main/java/com/volmit/iris/IrisSettings.java index 2e6c85132..cf534e85f 100644 --- a/src/main/java/com/volmit/iris/IrisSettings.java +++ b/src/main/java/com/volmit/iris/IrisSettings.java @@ -9,7 +9,7 @@ public class IrisSettings @DontObfuscate @Desc("Iris generator threads (must be 2 or higher).") - public int threads = 16; + public int threads = 128; @DontObfuscate @Desc("Compress parallax data in memory to reduce memory usage in exchange for more cpu usage.") diff --git a/src/main/java/com/volmit/iris/gen/BiomeChunkGenerator.java b/src/main/java/com/volmit/iris/gen/BiomeChunkGenerator.java index 152e0185d..960e33e43 100644 --- a/src/main/java/com/volmit/iris/gen/BiomeChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/BiomeChunkGenerator.java @@ -1,7 +1,5 @@ package com.volmit.iris.gen; -import java.util.concurrent.locks.ReentrantLock; - import org.bukkit.World; import com.volmit.iris.Iris; @@ -17,6 +15,7 @@ import com.volmit.iris.util.CNG; import com.volmit.iris.util.ChronoLatch; import com.volmit.iris.util.ChunkPosition; import com.volmit.iris.util.IrisInterpolation; +import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.KList; import com.volmit.iris.util.KMap; import com.volmit.iris.util.M; @@ -29,7 +28,7 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper = false) public abstract class BiomeChunkGenerator extends DimensionChunkGenerator { - protected ReentrantLock regLock; + protected IrisLock regLock; private KMap generators; private KMap ceilingGenerators; protected GenLayerBiome glBiome; @@ -44,7 +43,7 @@ public abstract class BiomeChunkGenerator extends DimensionChunkGenerator super(dimensionName); generators = new KMap<>(); ceilingGenerators = new KMap<>(); - regLock = new ReentrantLock(); + regLock = new IrisLock("BiomeChunkGenerator"); biomeHitCache = new KMap<>(); ceilingBiomeHitCache = new KMap<>(); biomeCache = new IrisBiome[256]; @@ -119,31 +118,47 @@ public abstract class BiomeChunkGenerator extends DimensionChunkGenerator { double hi = IrisInterpolation.getNoise(gen.getInterpolationFunction(), (int) Math.round(rx), (int) Math.round(rz), gen.getInterpolationScale(), (xx, zz) -> { - IrisBiome b = sampleBiome((int) xx, (int) zz).getBiome(); - - for(IrisBiomeGeneratorLink i : b.getGenerators()) + try { - if(i.getGenerator().equals(gen.getLoadKey())) + IrisBiome b = sampleBiome((int) xx, (int) zz).getBiome(); + + for(IrisBiomeGeneratorLink i : b.getGenerators()) { - return i.getMax(); + if(i.getGenerator().equals(gen.getLoadKey())) + { + return i.getMax(); + } } + } + catch(Throwable e) + { + Iris.warn("Failed to sample biome at " + rx + " " + rz + " using the generator " + gen.getLoadKey()); + } return 0; }); double lo = IrisInterpolation.getNoise(gen.getInterpolationFunction(), (int) Math.round(rx), (int) Math.round(rz), gen.getInterpolationScale(), (xx, zz) -> { - IrisBiome b = sampleBiome((int) xx, (int) zz).getBiome(); - - for(IrisBiomeGeneratorLink i : b.getGenerators()) + try { - if(i.getGenerator().equals(gen.getLoadKey())) + IrisBiome b = sampleBiome((int) xx, (int) zz).getBiome(); + + for(IrisBiomeGeneratorLink i : b.getGenerators()) { - return i.getMin(); + if(i.getGenerator().equals(gen.getLoadKey())) + { + return i.getMin(); + } } } + catch(Throwable e) + { + Iris.warn("Failed to sample biome at " + rx + " " + rz + " using the generator " + gen.getLoadKey()); + } + return 0; }); diff --git a/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java b/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java index 3203ac5e2..0d4ea9bc2 100644 --- a/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java @@ -2,7 +2,6 @@ package com.volmit.iris.gen; import java.io.IOException; import java.lang.reflect.Method; -import java.util.concurrent.locks.ReentrantLock; import org.bukkit.Chunk; import org.bukkit.World; @@ -15,6 +14,7 @@ import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisRegion; import com.volmit.iris.util.BiomeResult; import com.volmit.iris.util.CNG; +import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.KMap; import com.volmit.iris.util.RNG; @@ -26,13 +26,13 @@ import lombok.EqualsAndHashCode; public class IrisChunkGenerator extends CeilingChunkGenerator implements IrisContext { private Method initLighting; - private ReentrantLock lock; + private IrisLock lock; private KMap b = new KMap<>(); public IrisChunkGenerator(String dimensionName, int threads) { super(dimensionName, threads); - lock = new ReentrantLock(); + lock = new IrisLock("IrisChunkGenerator"); } @Override @@ -77,7 +77,7 @@ public class IrisChunkGenerator extends CeilingChunkGenerator implements IrisCon @Override protected void onTick(int ticks) { - super.onTick(ticks); + } @Override diff --git a/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java b/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java index e07b826ef..11c74dcd6 100644 --- a/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java @@ -1,7 +1,6 @@ package com.volmit.iris.gen; import java.io.IOException; -import java.util.concurrent.locks.ReentrantLock; import org.bukkit.World; import org.bukkit.block.data.BlockData; @@ -19,6 +18,7 @@ import com.volmit.iris.util.CaveResult; import com.volmit.iris.util.ChunkPosition; import com.volmit.iris.util.HeightMap; import com.volmit.iris.util.IObjectPlacer; +import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.KList; import com.volmit.iris.util.KMap; import com.volmit.iris.util.NastyRunnable; @@ -37,8 +37,8 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple protected KMap ceilingSliverCache; protected AtomicWorldData ceilingParallaxMap; private MasterLock masterLock; - private ReentrantLock lock = new ReentrantLock(); - private ReentrantLock lockq = new ReentrantLock(); + private IrisLock lock = new IrisLock("ParallaxLock"); + private IrisLock lockq = new IrisLock("ParallaxQueueLock"); private int sliverBuffer; public ParallaxChunkGenerator(String dimensionName, int threads) @@ -190,6 +190,8 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple p.end(); getMetrics().getParallax().put(p.getMilliseconds()); super.onPostParallaxPostGenerate(random, x, z, data, grid, height, biomeMap); + getParallaxMap().clean(ticks); + Iris.data.getObjectLoader().clean(); } protected void injectBiomeSky(int x, int z, BiomeGrid grid) @@ -370,13 +372,6 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple } } - @Override - protected void onTick(int ticks) - { - getParallaxMap().clean(ticks); - Iris.data.getObjectLoader().clean(); - } - public AtomicSliver sampleSliver(int x, int z) { ChunkPosition key = new ChunkPosition(x, z); @@ -387,7 +382,7 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple } AtomicSliver s = new AtomicSliver(x & 15, z & 15); - onGenerateColumn(x >> 4, z >> 4, x, z, x & 15, z & 15, s, null); + onGenerateColumn(x >> 4, z >> 4, x, z, x & 15, z & 15, s, null, true); getSliverCache().put(key, s); return s; diff --git a/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java b/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java index df4f41a20..71cf3db19 100644 --- a/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java @@ -1,7 +1,5 @@ package com.volmit.iris.gen; -import java.util.concurrent.locks.ReentrantLock; - import org.bukkit.World; import com.volmit.iris.Iris; @@ -10,6 +8,7 @@ import com.volmit.iris.gen.atomics.AtomicSliverMap; import com.volmit.iris.util.BiomeMap; import com.volmit.iris.util.GroupedExecutor; import com.volmit.iris.util.HeightMap; +import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.PrecisionStopwatch; import com.volmit.iris.util.RNG; @@ -25,7 +24,7 @@ public abstract class ParallelChunkGenerator extends BiomeChunkGenerator protected boolean unsafe; protected int cacheX; protected int cacheZ; - private ReentrantLock genlock; + private IrisLock genlock; protected boolean cachingAllowed; public ParallelChunkGenerator(String dimensionName, int threads) @@ -35,7 +34,7 @@ public abstract class ParallelChunkGenerator extends BiomeChunkGenerator cacheX = 0; cacheZ = 0; this.threads = threads; - genlock = new ReentrantLock(); + genlock = new IrisLock("ParallelGenLock"); } public void changeThreadCount(int tc) @@ -51,11 +50,11 @@ public abstract class ParallelChunkGenerator extends BiomeChunkGenerator } } - protected abstract void onGenerateColumn(int cx, int cz, int wx, int wz, int x, int z, AtomicSliver sliver, BiomeMap biomeMap, int onlyY); + protected abstract void onGenerateColumn(int cx, int cz, int wx, int wz, int x, int z, AtomicSliver sliver, BiomeMap biomeMap, boolean sampled); protected void onGenerateColumn(int cx, int cz, int wx, int wz, int x, int z, AtomicSliver sliver, BiomeMap biomeMap) { - onGenerateColumn(cx, cz, wx, wz, x, z, sliver, biomeMap, -1); + onGenerateColumn(cx, cz, wx, wz, x, z, sliver, biomeMap, false); } protected abstract int onSampleColumnHeight(int cx, int cz, int wx, int wz, int x, int z); diff --git a/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java b/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java index 2fb01d7d9..08c3685cd 100644 --- a/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java @@ -1,7 +1,5 @@ package com.volmit.iris.gen; -import java.util.concurrent.locks.ReentrantLock; - import org.bukkit.World; import org.bukkit.block.data.BlockData; @@ -9,6 +7,7 @@ import com.volmit.iris.Iris; import com.volmit.iris.object.IrisDimension; import com.volmit.iris.util.CaveResult; import com.volmit.iris.util.IPostBlockAccess; +import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.IrisPostBlockFilter; import com.volmit.iris.util.KList; import com.volmit.iris.util.PrecisionStopwatch; @@ -30,7 +29,7 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp private ChunkData currentData; private KList availableFilters; private String postKey; - private ReentrantLock lock; + private IrisLock lock; private int minPhase; private int maxPhase; @@ -39,7 +38,7 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp super(dimensionName, threads); availableFilters = new KList<>(); postKey = "post-" + dimensionName; - lock = new ReentrantLock(); + lock = new IrisLock("PostChunkGenerator"); } public void onInit(World world, RNG rng) diff --git a/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java b/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java index 08b5ea344..be3f14287 100644 --- a/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java @@ -1,7 +1,5 @@ package com.volmit.iris.gen; -import java.util.concurrent.locks.ReentrantLock; - import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.data.Bisected; @@ -23,6 +21,7 @@ import com.volmit.iris.util.BiomeResult; import com.volmit.iris.util.BlockDataTools; import com.volmit.iris.util.CaveResult; import com.volmit.iris.util.HeightMap; +import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.KList; import com.volmit.iris.util.M; import com.volmit.iris.util.RNG; @@ -41,7 +40,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator private RNG rockRandom; private int[] cacheHeightMap; private BiomeResult[] cacheTrueBiome; - private ReentrantLock cacheLock; + private IrisLock cacheLock; public TerrainChunkGenerator(String dimensionName, int threads) { @@ -49,7 +48,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator cacheHeightMap = new int[256]; cacheTrueBiome = new BiomeResult[256]; cachingAllowed = true; - cacheLock = new ReentrantLock(); + cacheLock = new IrisLock("TerrainCacheLock"); } public void onInit(World world, RNG rng) @@ -66,7 +65,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator } @Override - protected void onGenerateColumn(int cx, int cz, int rx, int rz, int x, int z, AtomicSliver sliver, BiomeMap biomeMap, int onlyY) + protected void onGenerateColumn(int cx, int cz, int rx, int rz, int x, int z, AtomicSliver sliver, BiomeMap biomeMap, boolean sampled) { if(x > 15 || x < 0 || z > 15 || z < 0) { @@ -96,7 +95,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator throw new RuntimeException("Null Biome!"); } - if(cachingAllowed) + if(cachingAllowed && !sampled) { try { @@ -112,7 +111,12 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator KList layers = biome.generateLayers(wx, wz, masterRandom, height, height - getFluidHeight()); KList seaLayers = biome.isSea() ? biome.generateSeaLayers(wx, wz, masterRandom, fluidHeight - height) : new KList<>(); - cacheInternalBiome(x, z, biome); + + if(cachingAllowed && !sampled) + { + cacheInternalBiome(x, z, biome); + } + boolean caverning = false; KList cavernHeights = new KList<>(); int lastCavernHeight = -1; @@ -252,7 +256,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator } } - if(cachingAllowed && highestPlaced < height) + if(!sampled && cachingAllowed && highestPlaced < height) { cacheHeightMap[(z << 4) | x] = highestPlaced; } @@ -327,6 +331,14 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator } } + if(d.getMaterial().equals(Material.WHEAT) || d.getMaterial().equals(Material.CARROTS) || d.getMaterial().equals(Material.POTATOES) || d.getMaterial().equals(Material.MELON_STEM) || d.getMaterial().equals(Material.PUMPKIN_STEM)) + { + if(!block.getMaterial().equals(Material.FARMLAND)) + { + sliver.set(k, BlockDataTools.getBlockData("FARMLAND")); + } + } + if(d instanceof Bisected && k < 254) { Bisected t = ((Bisected) d.clone()); diff --git a/src/main/java/com/volmit/iris/util/GroupedExecutor.java b/src/main/java/com/volmit/iris/util/GroupedExecutor.java index 0a49587c2..bafa9c0f8 100644 --- a/src/main/java/com/volmit/iris/util/GroupedExecutor.java +++ b/src/main/java/com/volmit/iris/util/GroupedExecutor.java @@ -5,19 +5,20 @@ import java.util.concurrent.Executors; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory; import java.util.concurrent.ForkJoinWorkerThread; -import java.util.concurrent.locks.ReentrantLock; + +import com.volmit.iris.Iris; public class GroupedExecutor { private int xc; private ExecutorService service; - private ReentrantLock lock; + private IrisLock lock; private KMap mirror; public GroupedExecutor(int threadLimit, int priority, String name) { xc = 1; - lock = new ReentrantLock(); + lock = new IrisLock("GX"); mirror = new KMap(); if(threadLimit == 1) @@ -74,14 +75,23 @@ public class GroupedExecutor return; } + PrecisionStopwatch s = PrecisionStopwatch.start(); + while(true) { - J.sleep(1); + J.sleep(0); if(mirror.get(g) == 0) { break; } + + if(s.getMilliseconds() > 30000) + { + Iris.warn("Couldn't unlock grouped task: " + g + "! Clearing Task Group Forcibly and timing out!"); + mirror.remove(g); + break; + } } } diff --git a/src/main/java/com/volmit/iris/util/ObjectResourceLoader.java b/src/main/java/com/volmit/iris/util/ObjectResourceLoader.java index 76c80bb7e..4e514dd58 100644 --- a/src/main/java/com/volmit/iris/util/ObjectResourceLoader.java +++ b/src/main/java/com/volmit/iris/util/ObjectResourceLoader.java @@ -31,7 +31,7 @@ public class ObjectResourceLoader extends ResourceLoader { if(useFlip.flip()) { - unloadLast(60000); + unloadLast(60000 * 5); } } diff --git a/src/main/java/com/volmit/iris/util/ResourceLoader.java b/src/main/java/com/volmit/iris/util/ResourceLoader.java index 6a1bdc15d..586706e8c 100644 --- a/src/main/java/com/volmit/iris/util/ResourceLoader.java +++ b/src/main/java/com/volmit/iris/util/ResourceLoader.java @@ -1,7 +1,6 @@ package com.volmit.iris.util; import java.io.File; -import java.util.concurrent.locks.ReentrantLock; import com.google.gson.Gson; import com.volmit.iris.Iris; @@ -17,11 +16,11 @@ public class ResourceLoader protected KList folderCache; protected Class objectClass; protected String cname; - protected ReentrantLock lock; + protected IrisLock lock; public ResourceLoader(File root, String folderName, String resourceTypeName, Class objectClass) { - lock = new ReentrantLock(); + lock = new IrisLock("Res"); folderMapCache = new KMap<>(); this.objectClass = objectClass; cname = objectClass.getCanonicalName();