PaperMC/patches/api/0101-Close-Plugin-Class-Loaders-on-Disable.patch

105 lines
4.6 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Tue, 1 May 2018 21:33:35 -0400
Subject: [PATCH] Close Plugin Class Loaders on Disable
This should close more memory leaks from /reload and disabling plugins,
by closing the class loader and the jar file.
Note: This patch is no longer necessary as upstream now also closes
PluginClassLoaders on disable. This patch is now only to keep around
API methods it previously added, and to add back the log message when a
PluginClassLoader fails to disable, as upstream decided to ignore the
exception.
diff --git a/src/main/java/org/bukkit/plugin/PluginLoader.java b/src/main/java/org/bukkit/plugin/PluginLoader.java
index a88733f1cd1ddb5d85ab1b0e6af4fd5b80bbc1c6..256e440e699942e3c9da4205bb964bdc10ec92c4 100644
--- a/src/main/java/org/bukkit/plugin/PluginLoader.java
+++ b/src/main/java/org/bukkit/plugin/PluginLoader.java
@@ -77,4 +77,21 @@ public interface PluginLoader {
* @param plugin Plugin to disable
*/
public void disablePlugin(@NotNull Plugin plugin);
+
+ // Paper start - close Classloader on disable
+ /**
+ * This method is no longer useful as upstream has
+ * made it so plugin classloaders are always closed on disable.
+ * Use {@link #disablePlugin(Plugin)} instead.
+ *
+ * @param plugin Plugin to disable
+ * @param closeClassloader unused
+ * @deprecated Classloader is always closed by upstream now.
+ */
+ @Deprecated(forRemoval = true)
+ // provide default to allow other PluginLoader implementations to work
+ default public void disablePlugin(@NotNull Plugin plugin, boolean closeClassloader) {
+ disablePlugin(plugin);
+ }
+ // Paper end - close Classloader on disable
}
diff --git a/src/main/java/org/bukkit/plugin/PluginManager.java b/src/main/java/org/bukkit/plugin/PluginManager.java
index 41e26451fe12d8e6e0ef73c85731b24b4e3f200c..0d1b20f2b5580ea5505ccc2f003925dbcee67199 100644
--- a/src/main/java/org/bukkit/plugin/PluginManager.java
+++ b/src/main/java/org/bukkit/plugin/PluginManager.java
@@ -161,6 +161,22 @@ public interface PluginManager {
*/
public void disablePlugin(@NotNull Plugin plugin);
+ // Paper start - close Classloader on disable
+ /**
+ * This method is no longer useful as upstream has
+ * made it so plugin classloaders are always closed on disable.
+ * Use {@link #disablePlugin(Plugin)} instead.
+ *
+ * @param plugin Plugin to disable
+ * @param closeClassloader unused
+ * @deprecated Classloader is always closed by upstream now.
+ */
+ @Deprecated(forRemoval = true)
+ public default void disablePlugin(@NotNull Plugin plugin, boolean closeClassloader) {
+ this.disablePlugin(plugin);
+ }
+ // Paper end - close Classloader on disable
+
/**
* Gets a {@link Permission} from its fully qualified name
*
diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
index 2d27dfb859c312d46a14d0356c7c3f227e965a67..7867243a8ed67416895cdcd949ac424f5d29d98b 100644
--- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java
+++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
@@ -498,6 +498,21 @@ public final class SimplePluginManager implements PluginManager {
}
}
+ // Paper start
+ /**
+ * This method is no longer useful as upstream has
+ * made it so plugin classloaders are always closed on disable.
+ * Use {@link #disablePlugins()} instead.
+ *
+ * @param closeClassloaders unused
+ * @deprecated Classloader is always closed by upstream now.
+ */
+ @Deprecated(forRemoval = true)
+ public void disablePlugins(boolean closeClassloaders) {
+ this.disablePlugins();
+ }
+ // Paper end
+
@Override
public void disablePlugin(@NotNull final Plugin plugin) {
if (plugin.isEnabled()) {
diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
index b7cd98f20de3421cd3b8a95cfa2155fa77afa8b1..7483ceff298cafa244bd99316a0338aa075267d4 100644
--- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
+++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
@@ -366,6 +366,7 @@ public final class JavaPluginLoader implements PluginLoader {
loader.close();
} catch (IOException ex) {
//
+ this.server.getLogger().log(Level.WARNING, "Error closing the PluginClassLoader for '" + plugin.getDescription().getFullName() + "'", ex); // Paper - log exception
}
}
}