9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2025-12-28 19:39:17 +00:00
Files
Leaf/patches/server/0061-Hearse-Fix-some-hearse-bugs.patch
2023-01-13 00:15:47 -05:00

188 lines
8.4 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: wangxyper <wangxyper@163.com>
Date: Wed, 11 Jan 2023 10:43:46 +0800
Subject: [PATCH] Hearse: Fix some hearse bugs
Original license: MIT
Original project: https://github.com/NaturalCodeClub/HearseRewrite
diff --git a/src/main/java/co/earthme/hearse/Hearse.java b/src/main/java/co/earthme/hearse/Hearse.java
index 79116449c221e0748e938f40366af03f93a4ab9f..f8fcb07bc54f4b150dacba325d0a47f0dc7687bc 100644
--- a/src/main/java/co/earthme/hearse/Hearse.java
+++ b/src/main/java/co/earthme/hearse/Hearse.java
@@ -16,7 +16,11 @@ public class Hearse {
public static void onServerStop(){
HearseConfig.save();
- workerManager.shutdownAllNow();
+ try {
+ workerManager.shutdownAll();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
}
public static WorkerThreadPoolManager getWorkerManager() {
diff --git a/src/main/java/co/earthme/hearse/commands/WorkerCommand.java b/src/main/java/co/earthme/hearse/commands/WorkerCommand.java
index 9bf8e0bdfed9a30a302c6369a727e8bb394b4670..1a4a6869a7278beadd97af006f4b5fae578b83ed 100644
--- a/src/main/java/co/earthme/hearse/commands/WorkerCommand.java
+++ b/src/main/java/co/earthme/hearse/commands/WorkerCommand.java
@@ -54,10 +54,10 @@ public class WorkerCommand extends Command {
searchedWorker.setCorePoolSize(Integer.parseInt(args[2]));
sender.sendMessage(ChatColor.GREEN+"Finished!");
}catch (NumberFormatException e){
- sender.sendMessage(ChatColor.RED+"Please supply a integer!");
+ sender.sendMessage(ChatColor.RED+"Please supply an integer!");
}
}else{
- sender.sendMessage(ChatColor.RED+"Please supply a integer!");
+ sender.sendMessage(ChatColor.RED+"Please supply an integer!");
}
break;
case "forceStop":
diff --git a/src/main/java/co/earthme/hearse/server/ServerEntityTickHook.java b/src/main/java/co/earthme/hearse/server/ServerEntityTickHook.java
index 18c1f6ee4d4fc422fb2aa41483ce145d34fa39b1..fd7912df03ae39347206fe8db2efa7a8a0e516c8 100644
--- a/src/main/java/co/earthme/hearse/server/ServerEntityTickHook.java
+++ b/src/main/java/co/earthme/hearse/server/ServerEntityTickHook.java
@@ -8,11 +8,15 @@ import co.earthme.hearse.concurrent.threadfactory.DefaultWorkerFactory;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.Entity;
+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;
public class ServerEntityTickHook {
+ private static final Logger logger = LogManager.getLogger();
private static volatile boolean firstTick = false;
private static final WorkerThreadFactory defFactory = new DefaultWorkerFactory();
private static final AtomicInteger threadId = new AtomicInteger();
@@ -21,7 +25,7 @@ public class ServerEntityTickHook {
public static void executeAsyncTask(Runnable task){
if (!asyncEntityEnabled){
- throw new IllegalStateException();
+ throw new RejectedExecutionException();
}
worker.execute(task);
}
@@ -87,6 +91,11 @@ public class ServerEntityTickHook {
task.run();
return;
}
- worker.execute(task);
+ try {
+ worker.execute(task);
+ }catch (RejectedExecutionException e){
+ logger.warn("Worker rejected our task.Falling back to sync entity updating");
+ asyncEntityEnabled = false;
+ }
}
}
diff --git a/src/main/java/co/earthme/hearse/workers/WorkerThreadPoolManager.java b/src/main/java/co/earthme/hearse/workers/WorkerThreadPoolManager.java
index 90dd97491c0313bee031b81aa43fe6df3dda5b4f..b1eb341728f41c5a62e35944c4b0222758ae8eef 100644
--- a/src/main/java/co/earthme/hearse/workers/WorkerThreadPoolManager.java
+++ b/src/main/java/co/earthme/hearse/workers/WorkerThreadPoolManager.java
@@ -15,15 +15,19 @@ public class WorkerThreadPoolManager {
public void shutdownAll() throws InterruptedException {
for (WorkerThreadPoolExecutor worker : this.managedWorkers.values()){
- worker.shutdown();
- while (worker.awaitTermination(100, TimeUnit.MILLISECONDS)) {}
+ if (!worker.isShutdown()){
+ worker.shutdown();
+ while (worker.awaitTermination(100, TimeUnit.MILLISECONDS)) {}
+ }
}
}
+ @Deprecated
public Map<String, WorkerThreadPoolExecutor> getManagedWorkers() {
return Maps.newHashMap(this.managedWorkers);
}
+ @Deprecated
public WorkerThreadPoolExecutor getTargetWorker(String bound){
return this.managedWorkers.get(bound);
}
@@ -33,14 +37,16 @@ public class WorkerThreadPoolManager {
for (Map.Entry<String,WorkerThreadPoolExecutor> entry : this.managedWorkers.entrySet()){
final String workerName = entry.getKey();
final WorkerThreadPoolExecutor worker = entry.getValue();
- try {
- final List<Runnable> taskNotRunned = worker.shutdownNow();
- while (worker.awaitTermination(1,TimeUnit.MILLISECONDS)){
+ if (!worker.isShutdown()){
+ try {
+ final List<Runnable> taskNotRunned = worker.shutdownNow();
+ while (worker.awaitTermination(1,TimeUnit.MILLISECONDS)){
+ }
+ ret.put(workerName,taskNotRunned);
+ }catch (Exception e){
+ e.printStackTrace();
}
- ret.put(workerName,taskNotRunned);
- }catch (Exception e){
- e.printStackTrace();
}
}
return ret;
@@ -51,18 +57,20 @@ public class WorkerThreadPoolManager {
for (Map.Entry<String,WorkerThreadPoolExecutor> entry : this.managedWorkers.entrySet()){
final String workerName = entry.getKey();
final WorkerThreadPoolExecutor worker = entry.getValue();
- try {
- long timeCounter = timeOutCount;
- final List<Runnable> taskNotRunned = worker.shutdownNow();
- while (worker.awaitTermination(1,TimeUnit.MILLISECONDS)){
- if (timeCounter == 0){
- break;
+ if (!worker.isShutdown()){
+ try {
+ long timeCounter = timeOutCount;
+ final List<Runnable> taskNotRunned = worker.shutdownNow();
+ while (worker.awaitTermination(1,TimeUnit.MILLISECONDS)){
+ if (timeCounter == 0){
+ break;
+ }
+ timeCounter--;
}
- timeCounter--;
+ ret.put(workerName,taskNotRunned);
+ }catch (Exception e){
+ e.printStackTrace();
}
- ret.put(workerName,taskNotRunned);
- }catch (Exception e){
- e.printStackTrace();
}
}
return ret;
@@ -71,14 +79,16 @@ public class WorkerThreadPoolManager {
public void shutdownAll(long singleWorkerAwaitTimeOutCount) throws InterruptedException {
long counter = singleWorkerAwaitTimeOutCount;
for (WorkerThreadPoolExecutor worker : this.managedWorkers.values()){
- worker.shutdown();
- while (worker.awaitTermination(1, TimeUnit.MILLISECONDS)) {
- if (counter == 0){
- break;
+ if (!worker.isShutdown()){
+ worker.shutdown();
+ while (worker.awaitTermination(1, TimeUnit.MILLISECONDS)) {
+ if (counter == 0){
+ break;
+ }
+ counter--;
}
- counter--;
+ counter = singleWorkerAwaitTimeOutCount;
}
- counter = singleWorkerAwaitTimeOutCount;
}
}
}