* Make PluginClassLoader thread-safe (fixes #3137) * Clean up implementation of MT safe class loader Co-authored-by: Aikar <aikar@aikar.co>
This commit is contained in:
parent
81706e6268
commit
78871d07dc
|
@ -0,0 +1,57 @@
|
|||
From eae57c232e30ee963d3ca6f69a5dc10179be5858 Mon Sep 17 00:00:00 2001
|
||||
From: Trigary <trigary0@gmail.com>
|
||||
Date: Wed, 15 Apr 2020 01:24:55 -0400
|
||||
Subject: [PATCH] Make JavaPluginLoader thread-safe
|
||||
|
||||
|
||||
diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
||||
index 8ff228ce..c0884f27 100644
|
||||
--- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
||||
+++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
|
||||
@@ -52,6 +52,8 @@ 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 ConcurrentHashMap<String, Class<?>>();
|
||||
+ private final Map<String, java.util.concurrent.locks.ReentrantReadWriteLock> classLoadLock = new java.util.HashMap<String, java.util.concurrent.locks.ReentrantReadWriteLock>(); // Paper
|
||||
+ private final Map<String, Integer> classLoadLockCount = new java.util.HashMap<String, Integer>(); // Paper
|
||||
private final List<PluginClassLoader> loaders = new CopyOnWriteArrayList<PluginClassLoader>();
|
||||
|
||||
/**
|
||||
@@ -191,6 +193,14 @@ public final class JavaPluginLoader implements PluginLoader {
|
||||
|
||||
@Nullable
|
||||
Class<?> getClassByName(final String name) {
|
||||
+ // Paper start - make MT safe
|
||||
+ java.util.concurrent.locks.ReentrantReadWriteLock lock;
|
||||
+ synchronized (classLoadLock) {
|
||||
+ lock = classLoadLock.computeIfAbsent(name, (x) -> new java.util.concurrent.locks.ReentrantReadWriteLock());
|
||||
+ classLoadLockCount.compute(name, (x, prev) -> prev != null ? prev + 1 : 1);
|
||||
+ }
|
||||
+ lock.writeLock().lock();try {
|
||||
+ // Paper end
|
||||
Class<?> cachedClass = classes.get(name);
|
||||
|
||||
if (cachedClass != null) {
|
||||
@@ -205,6 +215,19 @@ public final class JavaPluginLoader implements PluginLoader {
|
||||
}
|
||||
}
|
||||
}
|
||||
+ // Paper start - make MT safe
|
||||
+ } finally {
|
||||
+ synchronized (classLoadLock) {
|
||||
+ lock.writeLock().unlock();
|
||||
+ if (classLoadLockCount.get(name) == 1) {
|
||||
+ classLoadLock.remove(name);
|
||||
+ classLoadLockCount.remove(name);
|
||||
+ } else {
|
||||
+ classLoadLockCount.compute(name, (x, prev) -> prev - 1);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ // Paper end
|
||||
return null;
|
||||
}
|
||||
|
||||
--
|
||||
2.25.1
|
||||
|
Loading…
Reference in New Issue