From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: wangxyper Date: Sat, 21 Jan 2023 09:49:43 +0800 Subject: [PATCH] Hearse: Remove some fixes and await entity task Original license: MIT Original project: https://github.com/Era4FunMC/Hearse diff --git a/src/main/java/co/earthme/hearse/server/ServerEntityTickHook.java b/src/main/java/co/earthme/hearse/server/ServerEntityTickHook.java index c0d235e7227db0be6c6f753d8a6e13ad2716f798..891a9167e4072d6ce5b526b1676d8ecb836c8733 100644 --- a/src/main/java/co/earthme/hearse/server/ServerEntityTickHook.java +++ b/src/main/java/co/earthme/hearse/server/ServerEntityTickHook.java @@ -5,37 +5,37 @@ import co.earthme.hearse.HearseConfig; import co.earthme.hearse.concurrent.WorkerThreadFactory; import co.earthme.hearse.concurrent.WorkerThreadPoolExecutor; import co.earthme.hearse.concurrent.threadfactory.DefaultWorkerFactory; -import co.earthme.hearse.util.ArrayListBlockingQueue; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.player.Player; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.LockSupport; public class ServerEntityTickHook { private static final Logger logger = LogManager.getLogger(); - private static volatile boolean firstTick = false; private static final WorkerThreadFactory defFactory = new DefaultWorkerFactory("entity"); - private static final AtomicInteger threadId = new AtomicInteger(); private static WorkerThreadPoolExecutor worker; - private static boolean asyncEntityEnabled; + private static boolean asyncEntityEnabled = true; + private static boolean awaitEntityTasks = true; + private static final AtomicInteger taskCounter = new AtomicInteger(0); - public static void executeAsyncTask(Runnable task){ - if (!asyncEntityEnabled){ - throw new RejectedExecutionException(); + //To prevent the chunk system error.This is necessary + public static void awaitEntityTasks(){ + while (taskCounter.get() > 0){ + LockSupport.parkNanos("Await entities",1000000); } - worker.execute(task); } public static void init(){ - boolean asyncEntityEnabled1 = HearseConfig.getBoolean("optimizations.enable-async-entity",true); - final int workerCount = HearseConfig.getInt("workers.async-entity-worker-count",Runtime.getRuntime().availableProcessors()); - if (asyncEntityEnabled1){ + asyncEntityEnabled = HearseConfig.getBoolean("optimizations.enable-parallel-entity",asyncEntityEnabled); + awaitEntityTasks = HearseConfig.getBoolean("optimizations.await-parallel-entity-tasks",awaitEntityTasks); + if (asyncEntityEnabled){ + final int workerCount = HearseConfig.getInt("workers.async-entity-worker-count",Runtime.getRuntime().availableProcessors()); worker = new WorkerThreadPoolExecutor( workerCount, workerCount, @@ -46,47 +46,33 @@ public class ServerEntityTickHook { ); Hearse.getWorkerManager().addWorker("entity",worker); } - asyncEntityEnabled = asyncEntityEnabled1; - } - - public static void executeAsyncTaskWithMainThreadCallback(Runnable task,Runnable callBack){ - if (!asyncEntityEnabled){ - throw new IllegalStateException(); - } - worker.executeWithSubTask(task,callBack); - } - - public static void callTickStart(){ - if (!firstTick){ - firstTick = true; - return; - } - if (!asyncEntityEnabled){ - return; - } - worker.runAllSubTasks(); } public static void callAsyncEntityTick(Entity entity, ServerLevel level){ MinecraftServer.getServer().executeMidTickTasks(); + taskCounter.getAndIncrement(); Runnable task = ()->{ - entity.activatedPriorityReset = false; - if (!entity.isRemoved()) { - entity.checkDespawn(); - Entity entity1 = entity.getVehicle(); - if (entity1 != null) { - if (!entity1.isRemoved() && entity1.hasPassenger(entity)) { - return; + try { + entity.activatedPriorityReset = false; + if (!entity.isRemoved()) { + entity.checkDespawn(); + Entity entity1 = entity.getVehicle(); + if (entity1 != null) { + if (!entity1.isRemoved() && entity1.hasPassenger(entity)) { + return; + } + entity.stopRiding(); + } + try { + level.tickNonPassenger(entity); + } catch (Throwable throwable) { + if (throwable instanceof ThreadDeath) throw throwable; + level.getCraftServer().getPluginManager().callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerInternalException(throwable.getMessage(), throwable))); + throwable.printStackTrace(); } - entity.stopRiding(); - } - try { - level.tickNonPassenger(entity); - } catch (Throwable throwable) { - if (throwable instanceof ThreadDeath) throw throwable; - level.getCraftServer().getPluginManager().callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerInternalException(throwable.getMessage(), throwable))); - throwable.printStackTrace(); } + }finally { + taskCounter.getAndDecrement(); } }; if (!asyncEntityEnabled){ diff --git a/src/main/java/co/earthme/hearse/server/ServerLevelTickHook.java b/src/main/java/co/earthme/hearse/server/ServerLevelTickHook.java index 759b6dc9c719c6ff63348f9eacc760f8cef3163e..4c85bf8e4705a781a55a048f0b0541f0d32e2f07 100644 --- a/src/main/java/co/earthme/hearse/server/ServerLevelTickHook.java +++ b/src/main/java/co/earthme/hearse/server/ServerLevelTickHook.java @@ -20,13 +20,11 @@ import java.util.function.BooleanSupplier; public class ServerLevelTickHook { private static final DefaultWorkerFactory workerFactory = new DefaultWorkerFactory("world"); private static WorkerThreadPoolExecutor worker; - private static boolean enabledParaWorld; - private static volatile boolean inited = false; private static final AtomicInteger activeTaskCount = new AtomicInteger(); private static final Logger logger = LogManager.getLogger(); public static void initWorker(){ - enabledParaWorld = HearseConfig.getBoolean("optimizations.enableparallelworldtick",true); + boolean enabledParaWorld = HearseConfig.getBoolean("optimizations.enableparallelworldtick", true); if (enabledParaWorld){ worker = new WorkerThreadPoolExecutor( MinecraftServer.getServer().levels.size(), @@ -43,16 +41,11 @@ public class ServerLevelTickHook { logger.warn("World worker name:{}.This can help you to slove the lag problems when you using parallel world ticking",worker.getName()); } } - inited = true; - } - - public static boolean isInited(){ - return inited; } public static void callWorldTick(ServerLevel worldserver, BooleanSupplier shouldKeepTicking){ activeTaskCount.getAndIncrement(); - worker.execute(()->{ + Runnable task = () -> { try { try { worldserver.tick(shouldKeepTicking); @@ -66,7 +59,14 @@ public class ServerLevelTickHook { }finally { activeTaskCount.getAndDecrement(); } - }); + }; + + if (worker == null){ + task.run(); + return; + } + + worker.execute(task); } public static void awaitWorldTicKTasks(){ diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java index 42599340856aa5ffcfae2281684174ca4dee289a..f0f164c6c95c0abde63f1327335af94148910152 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -1,7 +1,6 @@ package net.minecraft.server; import co.earthme.hearse.Hearse; -import co.earthme.hearse.HearseConfig; import co.earthme.hearse.server.ServerEntityTickHook; import co.earthme.hearse.server.ServerLevelTickHook; import com.google.common.base.Splitter; @@ -1397,7 +1396,6 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop