Fix Optional null issue - Fixes #3155
Also check class loader cache before locking to speed up cached hits to avoid the lock wasn't gonna make a unique build just for that but can lump it in here.
This commit is contained in:
parent
eb71c5fa3b
commit
24d93aafa2
2 changed files with 14 additions and 9 deletions
|
@ -1,11 +1,11 @@
|
|||
From eae57c232e30ee963d3ca6f69a5dc10179be5858 Mon Sep 17 00:00:00 2001
|
||||
From 8ee6c03819b3128a206f5a5a73002bd719baf25b 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
|
||||
index 8ff228ce..ba2c5c6e 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 {
|
||||
|
@ -17,22 +17,27 @@ index 8ff228ce..c0884f27 100644
|
|||
private final List<PluginClassLoader> loaders = new CopyOnWriteArrayList<PluginClassLoader>();
|
||||
|
||||
/**
|
||||
@@ -191,6 +193,14 @@ public final class JavaPluginLoader implements PluginLoader {
|
||||
@@ -191,7 +193,19 @@ public final class JavaPluginLoader implements PluginLoader {
|
||||
|
||||
@Nullable
|
||||
Class<?> getClassByName(final String name) {
|
||||
+ // Paper start - make MT safe
|
||||
Class<?> cachedClass = classes.get(name);
|
||||
+ if (cachedClass != null) {
|
||||
+ return cachedClass;
|
||||
+ }
|
||||
+ 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 {
|
||||
+ cachedClass = classes.get(name);
|
||||
+ // Paper end
|
||||
Class<?> cachedClass = classes.get(name);
|
||||
|
||||
if (cachedClass != null) {
|
||||
@@ -205,6 +215,19 @@ public final class JavaPluginLoader implements PluginLoader {
|
||||
return cachedClass;
|
||||
@@ -205,6 +219,19 @@ public final class JavaPluginLoader implements PluginLoader {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue