From cf62349837574d353cb80cdff498d152fb337fd7 Mon Sep 17 00:00:00 2001 From: Sotr Date: Sat, 16 Jun 2018 20:36:18 +0800 Subject: [PATCH] Better world lock --- .../akarin/api/internal/mixin/IMixinLockProvider.java | 5 +++++ .../akarin/server/mixin/core/MixinMinecraftServer.java | 6 +++--- .../io/akarin/server/mixin/core/MixinWorldServer.java | 10 +++++++++- 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 sources/src/main/java/io/akarin/api/internal/mixin/IMixinLockProvider.java diff --git a/sources/src/main/java/io/akarin/api/internal/mixin/IMixinLockProvider.java b/sources/src/main/java/io/akarin/api/internal/mixin/IMixinLockProvider.java new file mode 100644 index 000000000..27e4ff670 --- /dev/null +++ b/sources/src/main/java/io/akarin/api/internal/mixin/IMixinLockProvider.java @@ -0,0 +1,5 @@ +package io.akarin.api.internal.mixin; + +public interface IMixinLockProvider { + public Object lock(); +} \ No newline at end of file diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java index c106c86ac..207730ff7 100644 --- a/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java +++ b/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java @@ -17,6 +17,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import co.aikar.timings.MinecraftTimings; import io.akarin.api.internal.Akari; +import io.akarin.api.internal.mixin.IMixinLockProvider; import io.akarin.server.core.AkarinGlobalConfig; import io.akarin.server.core.AkarinSlackScheduler; import net.minecraft.server.CrashReport; @@ -144,10 +145,9 @@ public abstract class MixinMinecraftServer { Akari.mayEnableAsyncCathcer = false; Akari.STAGE_TICK.submit(() -> { // Never tick one world concurrently! - // TODO better treat world index for (int i = 1; i <= worlds.size(); ++i) { WorldServer world = worlds.get(i < worlds.size() ? i : 0); - synchronized (world) { + synchronized (((IMixinLockProvider) world).lock()) { tickEntities(world); } } @@ -155,7 +155,7 @@ public abstract class MixinMinecraftServer { for (int i = 0; i < worlds.size(); ++i) { WorldServer world = worlds.get(i); - synchronized (world) { + synchronized (((IMixinLockProvider) world).lock()) { tickWorld(world); } } diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinWorldServer.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinWorldServer.java index 20b82c46f..b1c864e61 100644 --- a/sources/src/main/java/io/akarin/server/mixin/core/MixinWorldServer.java +++ b/sources/src/main/java/io/akarin/server/mixin/core/MixinWorldServer.java @@ -4,13 +4,21 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; +import io.akarin.api.internal.mixin.IMixinLockProvider; import net.minecraft.server.WorldServer; @Mixin(value = WorldServer.class, remap = false) -public abstract class MixinWorldServer { +public abstract class MixinWorldServer implements IMixinLockProvider { @Redirect(method = "doTick", at = @At( value = "INVOKE", target = "net/minecraft/server/PlayerChunkMap.flush()V" )) public void onFlush() {} // Migrated to main thread + + private final Object tickLock = new Object(); + + @Override + public Object lock() { + return tickLock; + } }