diff --git a/sources/src/main/java/io/akarin/api/Akari.java b/sources/src/main/java/io/akarin/api/Akari.java index 462171ef6..93d580c3f 100644 --- a/sources/src/main/java/io/akarin/api/Akari.java +++ b/sources/src/main/java/io/akarin/api/Akari.java @@ -1,5 +1,6 @@ package io.akarin.api; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Queue; import java.util.concurrent.ExecutorCompletionService; @@ -14,6 +15,7 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder; import co.aikar.timings.Timing; import co.aikar.timings.Timings; +import io.netty.channel.Channel.Unsafe; public abstract class Akari { /** @@ -41,6 +43,22 @@ public abstract class Akari { */ public static final ExecutorCompletionService STAGE_TICK = new ExecutorCompletionService(Executors.newFixedThreadPool(1, Akari.STAGE_FACTORY)); + /* + * The unsafe + */ + public static sun.misc.Unsafe UNSAFE = getUnsafe(); + + private static sun.misc.Unsafe getUnsafe() { + try { + Field theUnsafe = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); + theUnsafe.setAccessible(true); + return (sun.misc.Unsafe) theUnsafe.get(null); + } catch (Throwable t) { + t.printStackTrace(); + return null; + } + } + /* * Timings */ diff --git a/sources/src/main/java/io/akarin/api/CheckedConcurrentLinkedQueue.java b/sources/src/main/java/io/akarin/api/CheckedConcurrentLinkedQueue.java index 7c459f89f..22be3cc93 100644 --- a/sources/src/main/java/io/akarin/api/CheckedConcurrentLinkedQueue.java +++ b/sources/src/main/java/io/akarin/api/CheckedConcurrentLinkedQueue.java @@ -35,6 +35,7 @@ package io.akarin.api; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.AbstractQueue; import java.util.ArrayList; @@ -46,7 +47,7 @@ import java.util.Spliterator; import java.util.Spliterators; import java.util.function.Consumer; -import io.netty.channel.Channel.Unsafe; +import io.akarin.server.core.AkarinGlobalConfig; import net.minecraft.server.PacketPlayOutMapChunk; import net.minecraft.server.NetworkManager.QueuedPacket; @@ -214,7 +215,7 @@ public class CheckedConcurrentLinkedQueue extends AbstractQueue static { try { - UNSAFE = sun.misc.Unsafe.getUnsafe(); + UNSAFE = Akari.UNSAFE; // Akarin Class k = Node.class; itemOffset = UNSAFE.objectFieldOffset (k.getDeclaredField("item")); @@ -993,11 +994,7 @@ public class CheckedConcurrentLinkedQueue extends AbstractQueue private static final long tailOffset; static { try { - // Akarin start - use reflection to access unsafe - Method getUnsafe = Unsafe.class.getDeclaredMethod("getUnsafe"); - getUnsafe.setAccessible(true); - UNSAFE = (sun.misc.Unsafe) getUnsafe.invoke(null, true); - // Akarin end + UNSAFE = Akari.UNSAFE; // Akarin Class k = CheckedConcurrentLinkedQueue.class; headOffset = UNSAFE.objectFieldOffset (k.getDeclaredField("head")); 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 536d9fcf6..a0aeb5432 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 @@ -73,11 +73,6 @@ public class MixinMinecraftServer { @Overwrite public void D() throws InterruptedException { - Runnable runnable; - Akari.callbackTiming().startTiming(); - while ((runnable = Akari.callbackQueue.poll()) != null) runnable.run(); - Akari.callbackTiming().stopTiming(); - MinecraftTimings.bukkitSchedulerTimer.startTiming(); this.server.getScheduler().mainThreadHeartbeat(this.ticks); MinecraftTimings.bukkitSchedulerTimer.stopTiming(); @@ -90,6 +85,7 @@ public class MixinMinecraftServer { } MinecraftTimings.minecraftSchedulerTimer.stopTiming(); + Runnable runnable; MinecraftTimings.processQueueTimer.startTiming(); while ((runnable = processQueue.poll()) != null) runnable.run(); MinecraftTimings.processQueueTimer.stopTiming(); @@ -144,6 +140,10 @@ public class MixinMinecraftServer { this.an().c(); MinecraftTimings.connectionTimer.stopTiming(); + Akari.callbackTiming().startTiming(); + while ((runnable = Akari.callbackQueue.poll()) != null) runnable.run(); + Akari.callbackTiming().stopTiming(); + MinecraftTimings.playerListTimer.startTiming(); this.v.tick(); MinecraftTimings.playerListTimer.stopTiming(); diff --git a/sources/src/main/resources/mixins.akarin.core.json b/sources/src/main/resources/mixins.akarin.core.json index bac9cd1a3..a9e68d25d 100644 --- a/sources/src/main/resources/mixins.akarin.core.json +++ b/sources/src/main/resources/mixins.akarin.core.json @@ -20,7 +20,6 @@ "MixinVersionCommand", "MixinMinecraftServer", "MixinChunkIOExecutor", - "MixinPlayerConnection", "MixinTileEntityEnchantTable" ] } \ No newline at end of file