From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Ivan Pekov <ivan@mrivanplays.com>
Date: Mon, 5 Oct 2020 17:09:00 +0300
Subject: [PATCH] Ensure pools create daemon threads

If only 1 non-daemon thread is left to run when the server is shutting down, the server won't shut down.
This patche ensures that executors make daemon threads.

diff --git a/src/main/java/net/minecraft/server/LoginListener.java b/src/main/java/net/minecraft/server/LoginListener.java
index 2b4ac8d1f3218e89b73fb9e1d3eed8cb8bf7334d..fce976bc6a0eb08083a06622935bff05d737a9a3 100644
--- a/src/main/java/net/minecraft/server/LoginListener.java
+++ b/src/main/java/net/minecraft/server/LoginListener.java
@@ -109,7 +109,11 @@ public class LoginListener implements PacketLoginInListener {
     // Paper start - Cache authenticator threads
     private static final AtomicInteger threadId = new AtomicInteger(0);
     private static final java.util.concurrent.ExecutorService authenticatorPool = java.util.concurrent.Executors.newCachedThreadPool(
-            r -> new Thread(r, "User Authenticator #" + threadId.incrementAndGet())
+            r -> { // Yatopia start - make sure produced threads are daemon ones
+                Thread thread = new Thread(r, "User Authenticator #" + threadId.incrementAndGet());
+                thread.setDaemon(true);
+                return thread;
+            } // Yatopia end
     );
     // Paper end
     // Spigot start
diff --git a/src/main/java/net/minecraft/server/MCUtil.java b/src/main/java/net/minecraft/server/MCUtil.java
index e79e773f2219f9a9ae076fcbc8108b792201b11a..5100314050dbbc633e6379eb1a523242623cfa8f 100644
--- a/src/main/java/net/minecraft/server/MCUtil.java
+++ b/src/main/java/net/minecraft/server/MCUtil.java
@@ -42,12 +42,12 @@ public final class MCUtil {
     public static final ThreadPoolExecutor asyncExecutor = new ThreadPoolExecutor(
         0, 2, 60L, TimeUnit.SECONDS,
         new LinkedBlockingQueue<Runnable>(),
-        new ThreadFactoryBuilder().setNameFormat("Paper Async Task Handler Thread - %1$d").build()
+        new ThreadFactoryBuilder().setDaemon(true).setNameFormat("Paper Async Task Handler Thread - %1$d").build() // Yatopia - daemon
     );
     public static final ThreadPoolExecutor cleanerExecutor = new ThreadPoolExecutor(
         1, 1, 0L, TimeUnit.SECONDS,
         new LinkedBlockingQueue<Runnable>(),
-        new ThreadFactoryBuilder().setNameFormat("Paper Object Cleaner").build()
+        new ThreadFactoryBuilder().setDaemon(true).setNameFormat("Paper Object Cleaner").build() // Yatopia - daemon
     );
 
     public static final long INVALID_CHUNK_KEY = getCoordinateKey(Integer.MAX_VALUE, Integer.MAX_VALUE);
