[Edge] Parallel network tick w/ Cleanup
This commit is contained in:
@@ -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
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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"));
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -20,7 +20,6 @@
|
|||||||
"MixinVersionCommand",
|
"MixinVersionCommand",
|
||||||
"MixinMinecraftServer",
|
"MixinMinecraftServer",
|
||||||
"MixinChunkIOExecutor",
|
"MixinChunkIOExecutor",
|
||||||
"MixinPlayerConnection",
|
|
||||||
"MixinTileEntityEnchantTable"
|
"MixinTileEntityEnchantTable"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user