diff --git a/core/src/main/java/com/volmit/iris/util/parallel/AtomicBooleanArray.java b/core/src/main/java/com/volmit/iris/util/parallel/AtomicBooleanArray.java index 5d2603a85..575634831 100644 --- a/core/src/main/java/com/volmit/iris/util/parallel/AtomicBooleanArray.java +++ b/core/src/main/java/com/volmit/iris/util/parallel/AtomicBooleanArray.java @@ -24,6 +24,10 @@ public class AtomicBooleanArray implements Serializable { AA.setVolatile(array, index, newValue); } + public final boolean getAndSet(int index, boolean newValue) { + return (boolean) AA.getAndSet(array, index, newValue); + } + public final boolean compareAndSet(int index, boolean expectedValue, boolean newValue) { return (boolean) AA.compareAndSet(array, index, expectedValue, newValue); } diff --git a/core/src/main/kotlin/com/volmit/iris/engine/mantle/MatterGenerator.kt b/core/src/main/kotlin/com/volmit/iris/engine/mantle/MatterGenerator.kt index 492f2dc85..db579b096 100644 --- a/core/src/main/kotlin/com/volmit/iris/engine/mantle/MatterGenerator.kt +++ b/core/src/main/kotlin/com/volmit/iris/engine/mantle/MatterGenerator.kt @@ -34,8 +34,11 @@ interface MatterGenerator { return@radius for (c in pair.a) { + if (mc.isFlagged(c.flag)) + continue + launch(multicore) { - mc.raiseFlagSuspend(MantleFlag.PLANNED, c.flag) { + mc.raiseFlagSuspend(c.flag) { c.generateLayer(writer, x, z, context) } } diff --git a/core/src/main/kotlin/com/volmit/iris/util/mantle/FlaggedChunk.kt b/core/src/main/kotlin/com/volmit/iris/util/mantle/FlaggedChunk.kt index ca40d682f..28967ecbe 100644 --- a/core/src/main/kotlin/com/volmit/iris/util/mantle/FlaggedChunk.kt +++ b/core/src/main/kotlin/com/volmit/iris/util/mantle/FlaggedChunk.kt @@ -49,19 +49,15 @@ abstract class FlaggedChunk() { flags.set(flag.ordinal(), value) } - suspend fun raiseFlagSuspend(guard: MantleFlag?, flag: MantleFlag, task: suspend () -> Unit) { + suspend fun raiseFlagSuspend(flag: MantleFlag, task: suspend () -> Unit) { if (isClosed()) throw IllegalStateException("Chunk is closed!") - if (guard != null && isFlagged(guard)) return + if (isFlagged(flag)) return locks[flag.ordinal()].withLock { - if (flags.compareAndSet(flag.ordinal(), false, true)) { - try { - task() - } catch (e: Throwable) { - flags.set(flag.ordinal(), false) - throw e - } - } + if (isFlagged(flag)) return + task() + if (flags.getAndSet(flag.ordinal(), true)) + throw IllegalStateException("Flag ${flag.name()} was already set after task ran!") } }