[Edge] Parallel network tick w/ Cleanup

This commit is contained in:
Sotr
2018-06-06 22:24:46 +08:00
parent 367bcdabf7
commit 8ca09fcaf6
4 changed files with 27 additions and 13 deletions

View File

@@ -1,5 +1,6 @@
package io.akarin.api; package io.akarin.api;
import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Queue; import java.util.Queue;
import java.util.concurrent.ExecutorCompletionService; 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.Timing;
import co.aikar.timings.Timings; import co.aikar.timings.Timings;
import io.netty.channel.Channel.Unsafe;
public abstract class Akari { public abstract class Akari {
/** /**
@@ -41,6 +43,22 @@ public abstract class Akari {
*/ */
public static final ExecutorCompletionService<Void> STAGE_TICK = new ExecutorCompletionService<Void>(Executors.newFixedThreadPool(1, Akari.STAGE_FACTORY)); public static final ExecutorCompletionService<Void> STAGE_TICK = new ExecutorCompletionService<Void>(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 * Timings
*/ */

View File

@@ -35,6 +35,7 @@
package io.akarin.api; package io.akarin.api;
import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.AbstractQueue; import java.util.AbstractQueue;
import java.util.ArrayList; import java.util.ArrayList;
@@ -46,7 +47,7 @@ import java.util.Spliterator;
import java.util.Spliterators; import java.util.Spliterators;
import java.util.function.Consumer; 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.PacketPlayOutMapChunk;
import net.minecraft.server.NetworkManager.QueuedPacket; import net.minecraft.server.NetworkManager.QueuedPacket;
@@ -214,7 +215,7 @@ public class CheckedConcurrentLinkedQueue extends AbstractQueue<QueuedPacket>
static { static {
try { try {
UNSAFE = sun.misc.Unsafe.getUnsafe(); UNSAFE = Akari.UNSAFE; // Akarin
Class<?> k = Node.class; Class<?> k = Node.class;
itemOffset = UNSAFE.objectFieldOffset itemOffset = UNSAFE.objectFieldOffset
(k.getDeclaredField("item")); (k.getDeclaredField("item"));
@@ -993,11 +994,7 @@ public class CheckedConcurrentLinkedQueue extends AbstractQueue<QueuedPacket>
private static final long tailOffset; private static final long tailOffset;
static { static {
try { try {
// Akarin start - use reflection to access unsafe UNSAFE = Akari.UNSAFE; // Akarin
Method getUnsafe = Unsafe.class.getDeclaredMethod("getUnsafe");
getUnsafe.setAccessible(true);
UNSAFE = (sun.misc.Unsafe) getUnsafe.invoke(null, true);
// Akarin end
Class<?> k = CheckedConcurrentLinkedQueue.class; Class<?> k = CheckedConcurrentLinkedQueue.class;
headOffset = UNSAFE.objectFieldOffset headOffset = UNSAFE.objectFieldOffset
(k.getDeclaredField("head")); (k.getDeclaredField("head"));

View File

@@ -73,11 +73,6 @@ public class MixinMinecraftServer {
@Overwrite @Overwrite
public void D() throws InterruptedException { public void D() throws InterruptedException {
Runnable runnable;
Akari.callbackTiming().startTiming();
while ((runnable = Akari.callbackQueue.poll()) != null) runnable.run();
Akari.callbackTiming().stopTiming();
MinecraftTimings.bukkitSchedulerTimer.startTiming(); MinecraftTimings.bukkitSchedulerTimer.startTiming();
this.server.getScheduler().mainThreadHeartbeat(this.ticks); this.server.getScheduler().mainThreadHeartbeat(this.ticks);
MinecraftTimings.bukkitSchedulerTimer.stopTiming(); MinecraftTimings.bukkitSchedulerTimer.stopTiming();
@@ -90,6 +85,7 @@ public class MixinMinecraftServer {
} }
MinecraftTimings.minecraftSchedulerTimer.stopTiming(); MinecraftTimings.minecraftSchedulerTimer.stopTiming();
Runnable runnable;
MinecraftTimings.processQueueTimer.startTiming(); MinecraftTimings.processQueueTimer.startTiming();
while ((runnable = processQueue.poll()) != null) runnable.run(); while ((runnable = processQueue.poll()) != null) runnable.run();
MinecraftTimings.processQueueTimer.stopTiming(); MinecraftTimings.processQueueTimer.stopTiming();
@@ -144,6 +140,10 @@ public class MixinMinecraftServer {
this.an().c(); this.an().c();
MinecraftTimings.connectionTimer.stopTiming(); MinecraftTimings.connectionTimer.stopTiming();
Akari.callbackTiming().startTiming();
while ((runnable = Akari.callbackQueue.poll()) != null) runnable.run();
Akari.callbackTiming().stopTiming();
MinecraftTimings.playerListTimer.startTiming(); MinecraftTimings.playerListTimer.startTiming();
this.v.tick(); this.v.tick();
MinecraftTimings.playerListTimer.stopTiming(); MinecraftTimings.playerListTimer.stopTiming();

View File

@@ -20,7 +20,6 @@
"MixinVersionCommand", "MixinVersionCommand",
"MixinMinecraftServer", "MixinMinecraftServer",
"MixinChunkIOExecutor", "MixinChunkIOExecutor",
"MixinPlayerConnection",
"MixinTileEntityEnchantTable" "MixinTileEntityEnchantTable"
] ]
} }