mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-28 19:39:17 +00:00
188 lines
8.4 KiB
Diff
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;
|
|
}
|
|
}
|
|
}
|