6a5e553feb
a3168ab2ce4 9b45d9fa8d3 b43a31a5c25 a926b96d5d1 d6b5ba7ca03 bb782d07aed 5a74d55c678 47b1dff3e68 [M]
67 lines
3.6 KiB
Diff
67 lines
3.6 KiB
Diff
From a6422025ca106765cdb65850b95312bfd09d715f Mon Sep 17 00:00:00 2001
|
|
From: md_5 <git@md-5.net>
|
|
Date: Wed, 16 Jul 2014 17:24:21 +1000
|
|
Subject: [PATCH] Ease ClassLoader Deadlocks Where Possible
|
|
|
|
When on Java 7 we can register the classloader as parallel capable to prevent deadlocks caused by certain scenarios. Due to the nature of PluginClassLoader this isn't completely safe, but we can make it safer by switching to concurrency focused collections. Either way this is far better than crashing the server.
|
|
|
|
diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
|
index b081ecb..0ac8325 100644
|
|
--- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
|
+++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
|
@@ -48,7 +48,7 @@ import org.yaml.snakeyaml.error.YAMLException;
|
|
public final class JavaPluginLoader implements PluginLoader {
|
|
final Server server;
|
|
private final Pattern[] fileFilters = new Pattern[] { Pattern.compile("\\.jar$"), };
|
|
- private final Map<String, Class<?>> classes = new HashMap<String, Class<?>>();
|
|
+ private final Map<String, Class<?>> classes = new java.util.concurrent.ConcurrentHashMap<String, Class<?>>(); // Spigot
|
|
private final Map<String, PluginClassLoader> loaders = new LinkedHashMap<String, PluginClassLoader>();
|
|
public static final CustomTimingsHandler pluginParentTimer = new CustomTimingsHandler("** Plugins"); // Spigot
|
|
|
|
diff --git a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
|
|
index 13f8633..4cffa13 100644
|
|
--- a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
|
|
+++ b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
|
|
@@ -17,7 +17,7 @@ import org.bukkit.plugin.PluginDescriptionFile;
|
|
*/
|
|
final class PluginClassLoader extends URLClassLoader {
|
|
private final JavaPluginLoader loader;
|
|
- private final Map<String, Class<?>> classes = new HashMap<String, Class<?>>();
|
|
+ private final Map<String, Class<?>> classes = new java.util.concurrent.ConcurrentHashMap<String, Class<?>>(); // Spigot
|
|
private final PluginDescriptionFile description;
|
|
private final File dataFolder;
|
|
private final File file;
|
|
@@ -25,6 +25,30 @@ final class PluginClassLoader extends URLClassLoader {
|
|
private JavaPlugin pluginInit;
|
|
private IllegalStateException pluginState;
|
|
|
|
+ // Spigot Start
|
|
+ static
|
|
+ {
|
|
+ try
|
|
+ {
|
|
+ java.lang.reflect.Method method = ClassLoader.class.getDeclaredMethod( "registerAsParallelCapable" );
|
|
+ if ( method != null )
|
|
+ {
|
|
+ boolean oldAccessible = method.isAccessible();
|
|
+ method.setAccessible( true );
|
|
+ method.invoke( null );
|
|
+ method.setAccessible( oldAccessible );
|
|
+ org.bukkit.Bukkit.getLogger().log( java.util.logging.Level.INFO, "Set PluginClassLoader as parallel capable" );
|
|
+ }
|
|
+ } catch ( NoSuchMethodException ex )
|
|
+ {
|
|
+ // Ignore
|
|
+ } catch ( Exception ex )
|
|
+ {
|
|
+ org.bukkit.Bukkit.getLogger().log( java.util.logging.Level.WARNING, "Error setting PluginClassLoader as parallel capable", ex );
|
|
+ }
|
|
+ }
|
|
+ // Spigot End
|
|
+
|
|
PluginClassLoader(final JavaPluginLoader loader, final ClassLoader parent, final PluginDescriptionFile description, final File dataFolder, final File file) throws InvalidPluginException, MalformedURLException {
|
|
super(new URL[] {file.toURI().toURL()}, parent);
|
|
Validate.notNull(loader, "Loader cannot be null");
|
|
--
|
|
2.1.0
|
|
|