diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java b/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java index 001eea7a2..9adbd9591 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java @@ -222,22 +222,8 @@ public class CommandStudio implements DecreeExecutor { job.execute(sender(), latch::countDown); latch.await(); - int sections = mantle.getWorldHeight() >> 4; - chunkMap.forEach((pos, chunk) -> { - var c = mantle.getChunk(pos.getX(), pos.getZ()).use(); - try { - c.copyFlags(chunk); - c.clear(); - for (int y = 0; y < sections; y++) { - var slice = chunk.get(y); - if (slice == null) continue; - var s = c.getOrCreate(y); - slice.getSliceMap().forEach(s::putSlice); - } - } finally { - c.release(); - } - }); + chunkMap.forEach((pos, chunk) -> + mantle.getChunk(pos.getX(), pos.getZ()).copyFrom(chunk)); } catch (Throwable e) { sender().sendMessage("Error while regenerating chunks"); e.printStackTrace(); diff --git a/core/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java b/core/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java index 297140c5d..df9ef9041 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java @@ -131,9 +131,13 @@ public class MantleChunk extends FlaggedChunk { ref.release(); } - public void copyFlags(MantleChunk chunk) { + public void copyFrom(MantleChunk chunk) { use(); - super.copyFlags(chunk); + super.copyFrom(chunk, () -> { + for (int i = 0; i < sections.length(); i++) { + sections.set(i, chunk.get(i)); + } + }); release(); } 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 6fcdf6719..ca40d682f 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 @@ -3,6 +3,9 @@ package com.volmit.iris.util.mantle import com.volmit.iris.util.data.Varint import com.volmit.iris.util.mantle.flag.MantleFlag import com.volmit.iris.util.parallel.AtomicBooleanArray +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import java.io.DataInput @@ -22,9 +25,21 @@ abstract class FlaggedChunk() { abstract fun isClosed(): Boolean - protected fun copyFlags(other: FlaggedChunk) { + protected fun copyFrom(other: FlaggedChunk, action: Runnable) = runBlocking { + coroutineScope { + for (i in 0 until flags.length()) { + launch { locks[i].lock() }.start() + } + } + + action.run() + for (i in 0 until flags.length()) { - flags.set(i, other.flags.get(i)) + flags[i] = other.flags[i] + } + + for (i in 0 until flags.length()) { + locks[i].unlock() } }