Skip to content

Commit 4cf9156

Browse files
author
Dmytro Ukhlov
committed
Improve lockObject string calculation
1 parent 2db6350 commit 4cf9156

File tree

3 files changed

+9
-11
lines changed

3 files changed

+9
-11
lines changed

core/src/main/java/hudson/util/DelegatingClassLoader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundE
7575
* <p>Fails fast if a subclass erroneously defines a class here, which would violate the
7676
* delegation-only contract and could reintroduce locking/retention issues.
7777
*/
78-
protected Class<?> verify(Class<?> clazz) {
78+
private Class<?> verify(Class<?> clazz) {
7979
if (clazz.getClassLoader() == this) {
8080
throw new IllegalStateException("DelegatingClassLoader must not be the defining loader: " + clazz.getName());
8181
}

core/src/main/java/hudson/util/ExistenceCheckingClassLoader.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,13 @@ public ExistenceCheckingClassLoader(ClassLoader parent) {
4848
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
4949
// Add support for loading of JaCoCo dynamic instrumentation classes
5050
if (name.equals("java.lang.$JaCoCo")) {
51-
return verify(super.loadClass(name, resolve));
51+
return super.loadClass(name, resolve);
5252
}
5353

5454
if (getResource(name.replace('.', '/') + ".class") == null) {
5555
throw new ClassNotFoundException(name);
5656
}
5757

58-
return verify(super.loadClass(name, resolve));
58+
return super.loadClass(name, resolve);
5959
}
6060
}

core/src/main/java/jenkins/util/URLClassLoader2.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.net.URL;
44
import java.net.URLClassLoader;
55
import java.util.Objects;
6+
import java.util.concurrent.atomic.AtomicInteger;
67
import jenkins.ClassLoaderReflectionToolkit;
78
import org.kohsuke.accmod.Restricted;
89
import org.kohsuke.accmod.restrictions.NoExternalUse;
@@ -13,6 +14,10 @@
1314
*/
1415
@Restricted(NoExternalUse.class)
1516
public class URLClassLoader2 extends URLClassLoader implements JenkinsClassLoader {
17+
private static final AtomicInteger NEXT_INSTANCE_NUMBER = new AtomicInteger(0);
18+
19+
private final String lockObjectPrefixName = String.format("%s@%x-loadClassLock:",
20+
URLClassLoader2.class.getName(), NEXT_INSTANCE_NUMBER.getAndIncrement());
1621

1722
static {
1823
registerAsParallelCapable();
@@ -85,13 +90,6 @@ public Class<?> findLoadedClass2(String name) {
8590
@Override
8691
public Object getClassLoadingLock(String className) {
8792
Objects.requireNonNull(className);
88-
return new StringBuilder(128)
89-
.append(getClass().getSimpleName())
90-
.append("@")
91-
.append(Integer.toHexString(System.identityHashCode(this)))
92-
.append("-loadClassLock:")
93-
.append(className)
94-
.toString()
95-
.intern();
93+
return (lockObjectPrefixName + className).intern();
9694
}
9795
}

0 commit comments

Comments
 (0)