This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/main by this push: new a56929fed7 Refactor to reduce native calls a56929fed7 is described below commit a56929fed7ae62140fc43fb5ea114fe101a4cf6c Author: Mark Thomas <ma...@apache.org> AuthorDate: Fri Feb 24 14:59:43 2023 +0000 Refactor to reduce native calls Thread.currentThread() is a native call so ensure it is only used once per method, caching the result in a local variable if it is used more than once. --- java/org/apache/catalina/ant/ValidatorTask.java | 7 +- .../core/JreMemoryLeakPreventionListener.java | 7 +- java/org/apache/catalina/core/StandardContext.java | 5 +- java/org/apache/catalina/core/StandardServer.java | 5 +- .../catalina/ha/context/ReplicatedContext.java | 7 +- .../apache/catalina/ha/session/DeltaManager.java | 7 +- .../apache/catalina/ha/session/DeltaSession.java | 7 +- java/org/apache/catalina/loader/WebappLoader.java | 7 +- java/org/apache/catalina/realm/JAASRealm.java | 8 ++- java/org/apache/catalina/realm/JNDIRealm.java | 80 +++++++++++++--------- .../apache/catalina/servlets/DefaultServlet.java | 7 +- .../tribes/membership/McastServiceImpl.java | 37 +++++----- .../membership/StaticMembershipProvider.java | 14 ++-- .../membership/cloud/CloudMembershipProvider.java | 7 +- .../catalina/valves/StuckThreadDetectionValve.java | 5 +- java/org/apache/coyote/AsyncStateMachine.java | 7 +- java/org/apache/jasper/JspC.java | 9 +-- .../apache/jasper/compiler/JspDocumentParser.java | 7 +- .../apache/jasper/compiler/TagPluginManager.java | 7 +- java/org/apache/naming/ContextBindings.java | 10 +-- .../tomcat/util/descriptor/tld/TldParser.java | 7 +- .../tomcat/util/threads/ThreadPoolExecutor.java | 6 +- .../tomcat/websocket/AsyncChannelGroupUtil.java | 8 +-- .../tomcat/websocket/server/WsFrameServer.java | 14 ++-- .../TestWebappClassLoaderExecutorMemoryLeak.java | 11 ++- .../catalina/startup/TestTomcatClassLoader.java | 7 +- .../org/apache/juli/TestClassLoaderLogManager.java | 7 +- 27 files changed, 176 insertions(+), 134 deletions(-) diff --git a/java/org/apache/catalina/ant/ValidatorTask.java b/java/org/apache/catalina/ant/ValidatorTask.java index d5c7ffed3c..3ce62b60f5 100644 --- a/java/org/apache/catalina/ant/ValidatorTask.java +++ b/java/org/apache/catalina/ant/ValidatorTask.java @@ -80,8 +80,9 @@ public class ValidatorTask extends BaseRedirectorHelperTask { } // Commons-logging likes having the context classloader set - ClassLoader oldCL = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(ValidatorTask.class.getClassLoader()); + Thread currentThread = Thread.currentThread(); + ClassLoader oldCL = currentThread.getContextClassLoader(); + currentThread.setContextClassLoader(ValidatorTask.class.getClassLoader()); // Called through trusted manager interface. Digester digester = DigesterFactory.newDigester(true, true, null, false); @@ -97,7 +98,7 @@ public class ValidatorTask extends BaseRedirectorHelperTask { handleErrorOutput("Validation failure: " + e); } } finally { - Thread.currentThread().setContextClassLoader(oldCL); + currentThread.setContextClassLoader(oldCL); closeRedirector(); } diff --git a/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java b/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java index 5d87a8f5d4..df675f6b11 100644 --- a/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java +++ b/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java @@ -127,12 +127,13 @@ public class JreMemoryLeakPreventionListener implements LifecycleListener { DriverManager.getDrivers(); } - ClassLoader loader = Thread.currentThread().getContextClassLoader(); + Thread currentThread = Thread.currentThread(); + ClassLoader loader = currentThread.getContextClassLoader(); try { // Use the system classloader as the victim for all this // ClassLoader pinning we're about to do. - Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader()); + currentThread.setContextClassLoader(ClassLoader.getSystemClassLoader()); /* * Several components end up calling: sun.awt.AppContext.getAppContext() @@ -183,7 +184,7 @@ public class JreMemoryLeakPreventionListener implements LifecycleListener { } } finally { - Thread.currentThread().setContextClassLoader(loader); + currentThread.setContextClassLoader(loader); } } } diff --git a/java/org/apache/catalina/core/StandardContext.java b/java/org/apache/catalina/core/StandardContext.java index 7bab4058a2..21ac22928b 100644 --- a/java/org/apache/catalina/core/StandardContext.java +++ b/java/org/apache/catalina/core/StandardContext.java @@ -5464,8 +5464,9 @@ public class StandardContext extends ContainerBase implements Context, Notificat webApplicationClassLoader = loader.getClassLoader(); } + Thread currentThread = Thread.currentThread(); if (originalClassLoader == null) { - originalClassLoader = Thread.currentThread().getContextClassLoader(); + originalClassLoader = currentThread.getContextClassLoader(); } if (webApplicationClassLoader == null || webApplicationClassLoader == originalClassLoader) { @@ -5476,7 +5477,7 @@ public class StandardContext extends ContainerBase implements Context, Notificat ThreadBindingListener threadBindingListener = getThreadBindingListener(); - Thread.currentThread().setContextClassLoader(webApplicationClassLoader); + currentThread.setContextClassLoader(webApplicationClassLoader); if (threadBindingListener != null) { try { threadBindingListener.bind(); diff --git a/java/org/apache/catalina/core/StandardServer.java b/java/org/apache/catalina/core/StandardServer.java index 6b5f4f181f..eb5e91e932 100644 --- a/java/org/apache/catalina/core/StandardServer.java +++ b/java/org/apache/catalina/core/StandardServer.java @@ -553,9 +553,10 @@ public final class StandardServer extends LifecycleMBeanBase implements Server { // undocumented yet - for embedding apps that are around, alive. return; } + Thread currentThread = Thread.currentThread(); if (getPortWithOffset() == -1) { try { - awaitThread = Thread.currentThread(); + awaitThread = currentThread; while (!stopAwait) { try { Thread.sleep(10000); @@ -579,7 +580,7 @@ public final class StandardServer extends LifecycleMBeanBase implements Server { } try { - awaitThread = Thread.currentThread(); + awaitThread = currentThread; // Loop waiting for a connection and a valid command while (!stopAwait) { diff --git a/java/org/apache/catalina/ha/context/ReplicatedContext.java b/java/org/apache/catalina/ha/context/ReplicatedContext.java index 91c311708a..f916b32630 100644 --- a/java/org/apache/catalina/ha/context/ReplicatedContext.java +++ b/java/org/apache/catalina/ha/context/ReplicatedContext.java @@ -106,13 +106,14 @@ public class ReplicatedContext extends StandardContext implements MapOwner { if (loader != null) { classLoader = loader.getClassLoader(); } + Thread currentThread = Thread.currentThread(); if ( classLoader == null ) { - classLoader = Thread.currentThread().getContextClassLoader(); + classLoader = currentThread.getContextClassLoader(); } - if ( classLoader == Thread.currentThread().getContextClassLoader() ) { + if ( classLoader == currentThread.getContextClassLoader() ) { return new ClassLoader[] {classLoader}; } else { - return new ClassLoader[] {classLoader,Thread.currentThread().getContextClassLoader()}; + return new ClassLoader[] {classLoader,currentThread.getContextClassLoader()}; } } diff --git a/java/org/apache/catalina/ha/session/DeltaManager.java b/java/org/apache/catalina/ha/session/DeltaManager.java index 05b35782e5..ee41f8effe 100644 --- a/java/org/apache/catalina/ha/session/DeltaManager.java +++ b/java/org/apache/catalina/ha/session/DeltaManager.java @@ -1103,11 +1103,12 @@ public class DeltaManager extends ClusterManagerBase{ * requesting node */ protected void messageReceived(SessionMessage msg, Member sender) { - ClassLoader contextLoader = Thread.currentThread().getContextClassLoader(); + Thread currentThread = Thread.currentThread(); + ClassLoader contextLoader = currentThread.getContextClassLoader(); try { ClassLoader[] loaders = getClassLoaders(); - Thread.currentThread().setContextClassLoader(loaders[0]); + currentThread.setContextClassLoader(loaders[0]); if (log.isDebugEnabled()) { log.debug(sm.getString("deltaManager.receiveMessage.eventType", getName(), msg.getEventTypeString(), sender)); @@ -1148,7 +1149,7 @@ public class DeltaManager extends ClusterManagerBase{ } catch (Exception x) { log.error(sm.getString("deltaManager.receiveMessage.error",getName()), x); } finally { - Thread.currentThread().setContextClassLoader(contextLoader); + currentThread.setContextClassLoader(contextLoader); } } diff --git a/java/org/apache/catalina/ha/session/DeltaSession.java b/java/org/apache/catalina/ha/session/DeltaSession.java index d3188c56a4..769556923d 100644 --- a/java/org/apache/catalina/ha/session/DeltaSession.java +++ b/java/org/apache/catalina/ha/session/DeltaSession.java @@ -197,16 +197,17 @@ public class DeltaSession extends StandardSession implements Externalizable,Clus public void applyDiff(byte[] diff, int offset, int length) throws IOException, ClassNotFoundException { lockInternal(); try (ObjectInputStream stream = ((ClusterManager) getManager()).getReplicationStream(diff, offset, length)) { - ClassLoader contextLoader = Thread.currentThread().getContextClassLoader(); + Thread currentThread = Thread.currentThread(); + ClassLoader contextLoader = currentThread.getContextClassLoader(); try { ClassLoader[] loaders = getClassLoaders(); if (loaders != null && loaders.length > 0) { - Thread.currentThread().setContextClassLoader(loaders[0]); + currentThread.setContextClassLoader(loaders[0]); } getDeltaRequest().readExternal(stream); getDeltaRequest().execute(this, ((ClusterManager)getManager()).isNotifyListenersOnReplication()); } finally { - Thread.currentThread().setContextClassLoader(contextLoader); + currentThread.setContextClassLoader(contextLoader); } } finally { unlockInternal(); diff --git a/java/org/apache/catalina/loader/WebappLoader.java b/java/org/apache/catalina/loader/WebappLoader.java index ea858995ec..d14e3e687b 100644 --- a/java/org/apache/catalina/loader/WebappLoader.java +++ b/java/org/apache/catalina/loader/WebappLoader.java @@ -261,12 +261,13 @@ public class WebappLoader extends LifecycleMBeanBase implements Loader { Context context = getContext(); if (context != null) { if (context.getReloadable() && modified()) { - ClassLoader originalTccl = Thread.currentThread().getContextClassLoader(); + Thread currentThread = Thread.currentThread(); + ClassLoader originalTccl = currentThread.getContextClassLoader(); try { - Thread.currentThread().setContextClassLoader(WebappLoader.class.getClassLoader()); + currentThread.setContextClassLoader(WebappLoader.class.getClassLoader()); context.reload(); } finally { - Thread.currentThread().setContextClassLoader(originalTccl); + currentThread.setContextClassLoader(originalTccl); } } } diff --git a/java/org/apache/catalina/realm/JAASRealm.java b/java/org/apache/catalina/realm/JAASRealm.java index 4b6dbe3ee7..7fad24a192 100644 --- a/java/org/apache/catalina/realm/JAASRealm.java +++ b/java/org/apache/catalina/realm/JAASRealm.java @@ -375,10 +375,12 @@ public class JAASRealm extends RealmBase { // What if the LoginModule is in the container class loader ? ClassLoader ocl = null; + Thread currentThread = null; if (!isUseContextClassLoader()) { - ocl = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); + currentThread = Thread.currentThread(); + ocl = currentThread.getContextClassLoader(); + currentThread.setContextClassLoader(this.getClass().getClassLoader()); } try { @@ -393,7 +395,7 @@ public class JAASRealm extends RealmBase { return null; } finally { if (!isUseContextClassLoader()) { - Thread.currentThread().setContextClassLoader(ocl); + currentThread.setContextClassLoader(ocl); } } diff --git a/java/org/apache/catalina/realm/JNDIRealm.java b/java/org/apache/catalina/realm/JNDIRealm.java index 7fd80ede50..2f75f11619 100644 --- a/java/org/apache/catalina/realm/JNDIRealm.java +++ b/java/org/apache/catalina/realm/JNDIRealm.java @@ -1134,6 +1134,7 @@ public class JNDIRealm extends RealmBase { public Principal authenticate(String username, String credentials) { ClassLoader ocl = null; + Thread currentThread = null; JNDIConnection connection = null; Principal principal = null; @@ -1143,8 +1144,9 @@ public class JNDIRealm extends RealmBase { // running on a JVM that includes a fix for // https://bugs.openjdk.java.net/browse/JDK-8273874 if (!isUseContextClassLoader()) { - ocl = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); + currentThread = Thread.currentThread(); + ocl = currentThread.getContextClassLoader(); + currentThread.setContextClassLoader(this.getClass().getClassLoader()); } // Ensure that we have a directory context available @@ -1206,8 +1208,8 @@ public class JNDIRealm extends RealmBase { } return null; } finally { - if (!isUseContextClassLoader()) { - Thread.currentThread().setContextClassLoader(ocl); + if (currentThread != null) { + currentThread.setContextClassLoader(ocl); } } } @@ -1236,14 +1238,16 @@ public class JNDIRealm extends RealmBase { } ClassLoader ocl = null; + Thread currentThread= null; try { // https://bz.apache.org/bugzilla/show_bug.cgi?id=65553 // This can move back to open() once it is known that Tomcat must be // running on a JVM that includes a fix for // https://bugs.openjdk.java.net/browse/JDK-8273874 if (!isUseContextClassLoader()) { - ocl = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); + currentThread = Thread.currentThread(); + ocl = currentThread.getContextClassLoader(); + currentThread.setContextClassLoader(this.getClass().getClassLoader()); } if (userPatternArray != null) { @@ -1294,8 +1298,8 @@ public class JNDIRealm extends RealmBase { return new GenericPrincipal(username, roles); } } finally { - if (!isUseContextClassLoader()) { - Thread.currentThread().setContextClassLoader(ocl); + if (currentThread != null) { + currentThread.setContextClassLoader(ocl); } } } @@ -1309,15 +1313,17 @@ public class JNDIRealm extends RealmBase { @Override public Principal authenticate(String username) { ClassLoader ocl = null; + Thread currentThread = null; try { if (!isUseContextClassLoader()) { - ocl = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); + currentThread = Thread.currentThread(); + ocl = currentThread.getContextClassLoader(); + currentThread.setContextClassLoader(this.getClass().getClassLoader()); } return super.authenticate(username); } finally { - if (!isUseContextClassLoader()) { - Thread.currentThread().setContextClassLoader(ocl); + if (currentThread != null) { + currentThread.setContextClassLoader(ocl); } } } @@ -1332,15 +1338,17 @@ public class JNDIRealm extends RealmBase { public Principal authenticate(String username, String clientDigest, String nonce, String nc, String cnonce, String qop, String realm, String md5a2) { ClassLoader ocl = null; + Thread currentThread = null; try { if (!isUseContextClassLoader()) { - ocl = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); + currentThread = Thread.currentThread(); + ocl = currentThread.getContextClassLoader(); + currentThread.setContextClassLoader(this.getClass().getClassLoader()); } return super.authenticate(username, clientDigest, nonce, nc, cnonce, qop, realm, md5a2); } finally { - if (!isUseContextClassLoader()) { - Thread.currentThread().setContextClassLoader(ocl); + if (currentThread != null) { + currentThread.setContextClassLoader(ocl); } } } @@ -1354,15 +1362,17 @@ public class JNDIRealm extends RealmBase { @Override public Principal authenticate(X509Certificate[] certs) { ClassLoader ocl = null; + Thread currentThread = null; try { if (!isUseContextClassLoader()) { - ocl = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); + currentThread = Thread.currentThread(); + ocl = currentThread.getContextClassLoader(); + currentThread.setContextClassLoader(this.getClass().getClassLoader()); } return super.authenticate(certs); } finally { - if (!isUseContextClassLoader()) { - Thread.currentThread().setContextClassLoader(ocl); + if (currentThread != null) { + currentThread.setContextClassLoader(ocl); } } } @@ -1376,15 +1386,17 @@ public class JNDIRealm extends RealmBase { @Override public Principal authenticate(GSSContext gssContext, boolean storeCred) { ClassLoader ocl = null; + Thread currentThread = null; try { if (!isUseContextClassLoader()) { - ocl = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); + currentThread = Thread.currentThread(); + ocl = currentThread.getContextClassLoader(); + currentThread.setContextClassLoader(this.getClass().getClassLoader()); } return super.authenticate(gssContext, storeCred); } finally { - if (!isUseContextClassLoader()) { - Thread.currentThread().setContextClassLoader(ocl); + if (currentThread != null) { + currentThread.setContextClassLoader(ocl); } } } @@ -1398,15 +1410,17 @@ public class JNDIRealm extends RealmBase { @Override public Principal authenticate(GSSName gssName, GSSCredential gssCredential) { ClassLoader ocl = null; + Thread currentThread = null; try { if (!isUseContextClassLoader()) { - ocl = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); + currentThread = Thread.currentThread(); + ocl = currentThread.getContextClassLoader(); + currentThread.setContextClassLoader(this.getClass().getClassLoader()); } return super.authenticate(gssName, gssCredential); } finally { - if (!isUseContextClassLoader()) { - Thread.currentThread().setContextClassLoader(ocl); + if (currentThread != null) { + currentThread.setContextClassLoader(ocl); } } } @@ -2706,6 +2720,7 @@ public class JNDIRealm extends RealmBase { // Check to see if the connection to the directory can be opened ClassLoader ocl = null; + Thread currentThread = null; JNDIConnection connection = null; try { // https://bz.apache.org/bugzilla/show_bug.cgi?id=65553 @@ -2713,8 +2728,9 @@ public class JNDIRealm extends RealmBase { // running on a JVM that includes a fix for // https://bugs.openjdk.java.net/browse/JDK-8273874 if (!isUseContextClassLoader()) { - ocl = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); + currentThread = Thread.currentThread(); + ocl = currentThread.getContextClassLoader(); + currentThread.setContextClassLoader(this.getClass().getClassLoader()); } connection = get(); } catch (NamingException e) { @@ -2725,8 +2741,8 @@ public class JNDIRealm extends RealmBase { containerLog.error(sm.getString("jndiRealm.open"), e); } finally { release(connection); - if (!isUseContextClassLoader()) { - Thread.currentThread().setContextClassLoader(ocl); + if (currentThread != null) { + currentThread.setContextClassLoader(ocl); } } diff --git a/java/org/apache/catalina/servlets/DefaultServlet.java b/java/org/apache/catalina/servlets/DefaultServlet.java index 44f801285a..83e0aa142c 100644 --- a/java/org/apache/catalina/servlets/DefaultServlet.java +++ b/java/org/apache/catalina/servlets/DefaultServlet.java @@ -1683,9 +1683,10 @@ public class DefaultServlet extends HttpServlet { // Prevent possible memory leak. Ensure Transformer and // TransformerFactory are not loaded from the web application. - ClassLoader original = Thread.currentThread().getContextClassLoader(); + Thread currentThread = Thread.currentThread(); + ClassLoader original = currentThread.getContextClassLoader(); try { - Thread.currentThread().setContextClassLoader(DefaultServlet.class.getClassLoader()); + currentThread.setContextClassLoader(DefaultServlet.class.getClassLoader()); TransformerFactory tFactory = TransformerFactory.newInstance(); Source xmlSource = new StreamSource(new StringReader(sb.toString())); @@ -1700,7 +1701,7 @@ public class DefaultServlet extends HttpServlet { } catch (TransformerException e) { throw new ServletException(sm.getString("defaultServlet.xslError"), e); } finally { - Thread.currentThread().setContextClassLoader(original); + currentThread.setContextClassLoader(original); } } diff --git a/java/org/apache/catalina/tribes/membership/McastServiceImpl.java b/java/org/apache/catalina/tribes/membership/McastServiceImpl.java index 1fac0a4207..6c6e5fe6c7 100644 --- a/java/org/apache/catalina/tribes/membership/McastServiceImpl.java +++ b/java/org/apache/catalina/tribes/membership/McastServiceImpl.java @@ -400,18 +400,19 @@ public class McastServiceImpl extends MembershipProviderBase { log.trace("Mcast receive ping from member " + m); } Runnable t = null; + Thread currentThread = Thread.currentThread(); if (Arrays.equals(m.getCommand(), Member.SHUTDOWN_PAYLOAD)) { if (log.isDebugEnabled()) { log.debug("Member has shutdown:" + m); } membership.removeMember(m); t = () -> { - String name = Thread.currentThread().getName(); + String name = currentThread.getName(); try { - Thread.currentThread().setName("Membership-MemberDisappeared"); + currentThread.setName("Membership-MemberDisappeared"); service.memberDisappeared(m); - }finally { - Thread.currentThread().setName(name); + } finally { + currentThread.setName(name); } }; } else if (membership.memberAlive(m)) { @@ -419,16 +420,16 @@ public class McastServiceImpl extends MembershipProviderBase { log.debug("Mcast add member " + m); } t = () -> { - String name = Thread.currentThread().getName(); + String name = currentThread.getName(); try { - Thread.currentThread().setName("Membership-MemberAdded"); + currentThread.setName("Membership-MemberAdded"); service.memberAdded(m); - }finally { - Thread.currentThread().setName(name); + } finally { + currentThread.setName(name); } }; - } //end if - if ( t != null ) { + } + if (t != null) { executor.execute(t); } } @@ -449,9 +450,10 @@ public class McastServiceImpl extends MembershipProviderBase { } } Runnable t = () -> { - String name = Thread.currentThread().getName(); + Thread currentThread = Thread.currentThread(); + String name = currentThread.getName(); try { - Thread.currentThread().setName("Membership-MemberAdded"); + currentThread.setName("Membership-MemberAdded"); for (ChannelData datum : data) { try { if (datum != null && !member.equals(datum.getAddress())) { @@ -467,8 +469,8 @@ public class McastServiceImpl extends MembershipProviderBase { log.error(sm.getString("mcastServiceImpl.unableReceive.broadcastMessage"), t1); } } - }finally { - Thread.currentThread().setName(name); + } finally { + currentThread.setName(name); } }; executor.execute(t); @@ -485,12 +487,13 @@ public class McastServiceImpl extends MembershipProviderBase { } try { Runnable t = () -> { - String name = Thread.currentThread().getName(); + Thread currentThread = Thread.currentThread(); + String name = currentThread.getName(); try { - Thread.currentThread().setName("Membership-MemberExpired"); + currentThread.setName("Membership-MemberExpired"); service.memberDisappeared(member); } finally { - Thread.currentThread().setName(name); + currentThread.setName(name); } }; executor.execute(t); diff --git a/java/org/apache/catalina/tribes/membership/StaticMembershipProvider.java b/java/org/apache/catalina/tribes/membership/StaticMembershipProvider.java index 250a37d136..a4406b94c6 100644 --- a/java/org/apache/catalina/tribes/membership/StaticMembershipProvider.java +++ b/java/org/apache/catalina/tribes/membership/StaticMembershipProvider.java @@ -159,12 +159,13 @@ public class StaticMembershipProvider extends MembershipProviderBase implements Member mbr = setupMember(member); if(membership.memberAlive(mbr)) { Runnable r = () -> { - String name = Thread.currentThread().getName(); + Thread currentThread = Thread.currentThread(); + String name = currentThread.getName(); try { - Thread.currentThread().setName("StaticMembership-memberAdded"); + currentThread.setName("StaticMembership-memberAdded"); membershipListener.memberAdded(mbr); } finally { - Thread.currentThread().setName(name); + currentThread.setName(name); } }; executor.execute(r); @@ -174,12 +175,13 @@ public class StaticMembershipProvider extends MembershipProviderBase implements protected void memberDisappeared(Member member) { membership.removeMember(member); Runnable r = () -> { - String name = Thread.currentThread().getName(); + Thread currentThread = Thread.currentThread(); + String name = currentThread.getName(); try { - Thread.currentThread().setName("StaticMembership-memberDisappeared"); + currentThread.setName("StaticMembership-memberDisappeared"); membershipListener.memberDisappeared(member); } finally { - Thread.currentThread().setName(name); + currentThread.setName(name); } }; executor.execute(r); diff --git a/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipProvider.java b/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipProvider.java index 6b8fdf9cdf..4d86449252 100644 --- a/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipProvider.java +++ b/java/org/apache/catalina/tribes/membership/cloud/CloudMembershipProvider.java @@ -154,17 +154,18 @@ public abstract class CloudMembershipProvider extends MembershipProviderBase imp log.debug(message); } Runnable r = () -> { - String name = Thread.currentThread().getName(); + Thread currentThread = Thread.currentThread(); + String name = currentThread.getName(); try { String threadName = add ? "CloudMembership-memberAdded" : "CloudMembership-memberDisappeared"; - Thread.currentThread().setName(threadName); + currentThread.setName(threadName); if (add) { membershipListener.memberAdded(member); } else { membershipListener.memberDisappeared(member); } } finally { - Thread.currentThread().setName(name); + currentThread.setName(name); } }; executor.execute(r); diff --git a/java/org/apache/catalina/valves/StuckThreadDetectionValve.java b/java/org/apache/catalina/valves/StuckThreadDetectionValve.java index 584379dfa7..42b950d825 100644 --- a/java/org/apache/catalina/valves/StuckThreadDetectionValve.java +++ b/java/org/apache/catalina/valves/StuckThreadDetectionValve.java @@ -173,13 +173,14 @@ public class StuckThreadDetectionValve extends ValveBase { // Keeping a reference to the thread object here does not prevent // GC'ing, as the reference is removed from the Map in the finally clause - Long key = Long.valueOf(Thread.currentThread().getId()); + Thread currentThread = Thread.currentThread(); + Long key = Long.valueOf(currentThread.getId()); StringBuffer requestUrl = request.getRequestURL(); if (request.getQueryString() != null) { requestUrl.append('?'); requestUrl.append(request.getQueryString()); } - MonitoredThread monitoredThread = new MonitoredThread(Thread.currentThread(), requestUrl.toString(), + MonitoredThread monitoredThread = new MonitoredThread(currentThread, requestUrl.toString(), interruptThreadThreshold > 0); activeThreads.put(key, monitoredThread); diff --git a/java/org/apache/coyote/AsyncStateMachine.java b/java/org/apache/coyote/AsyncStateMachine.java index 9686b4919b..9368faa90b 100644 --- a/java/org/apache/coyote/AsyncStateMachine.java +++ b/java/org/apache/coyote/AsyncStateMachine.java @@ -434,12 +434,13 @@ class AsyncStateMachine { if (state == AsyncState.STARTING || state == AsyncState.STARTED || state == AsyncState.READ_WRITE_OP) { // Execute the runnable using a container thread from the // Connector's thread pool. Use a wrapper to prevent a memory leak - ClassLoader oldCL = Thread.currentThread().getContextClassLoader(); + Thread currentThread = Thread.currentThread(); + ClassLoader oldCL = currentThread.getContextClassLoader(); try { - Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); + currentThread.setContextClassLoader(this.getClass().getClassLoader()); processor.execute(runnable); } finally { - Thread.currentThread().setContextClassLoader(oldCL); + currentThread.setContextClassLoader(oldCL); } } else { throw new IllegalStateException(sm.getString("asyncStateMachine.invalidAsyncState", "asyncRun()", state)); diff --git a/java/org/apache/jasper/JspC.java b/java/org/apache/jasper/JspC.java index 9a259ea731..400fa256ed 100644 --- a/java/org/apache/jasper/JspC.java +++ b/java/org/apache/jasper/JspC.java @@ -1294,6 +1294,7 @@ public class JspC extends Task implements Options { } ClassLoader originalClassLoader = null; + Thread currentThread = Thread.currentThread(); try { // set up a scratch/output dir if none is provided @@ -1318,8 +1319,8 @@ public class JspC extends Task implements Options { clctxt.setBasePackageName(targetPackage); } - originalClassLoader = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(loader); + originalClassLoader = currentThread.getContextClassLoader(); + currentThread.setContextClassLoader(loader); clctxt.setClassLoader(loader); clctxt.setClassPath(classPath); @@ -1363,8 +1364,8 @@ public class JspC extends Task implements Options { } throw new JasperException(e); } finally { - if(originalClassLoader != null) { - Thread.currentThread().setContextClassLoader(originalClassLoader); + if (originalClassLoader != null) { + currentThread.setContextClassLoader(originalClassLoader); } } } diff --git a/java/org/apache/jasper/compiler/JspDocumentParser.java b/java/org/apache/jasper/compiler/JspDocumentParser.java index f7cecf24c1..a28d518738 100644 --- a/java/org/apache/jasper/compiler/JspDocumentParser.java +++ b/java/org/apache/jasper/compiler/JspDocumentParser.java @@ -1428,9 +1428,10 @@ class JspDocumentParser JspDocumentParser jspDocParser) throws Exception { - ClassLoader original = Thread.currentThread().getContextClassLoader(); + Thread currentThread = Thread.currentThread(); + ClassLoader original = currentThread.getContextClassLoader(); try { - Thread.currentThread().setContextClassLoader(JspDocumentParser.class.getClassLoader()); + currentThread.setContextClassLoader(JspDocumentParser.class.getClassLoader()); SAXParserFactory factory = SAXParserFactory.newInstance(); @@ -1460,7 +1461,7 @@ class JspDocumentParser return saxParser; } finally { - Thread.currentThread().setContextClassLoader(original); + currentThread.setContextClassLoader(original); } } diff --git a/java/org/apache/jasper/compiler/TagPluginManager.java b/java/org/apache/jasper/compiler/TagPluginManager.java index d92dbd14d5..f73ad8732f 100644 --- a/java/org/apache/jasper/compiler/TagPluginManager.java +++ b/java/org/apache/jasper/compiler/TagPluginManager.java @@ -73,9 +73,10 @@ public class TagPluginManager { } TagPluginParser parser; - ClassLoader original = Thread.currentThread().getContextClassLoader(); + Thread currentThread = Thread.currentThread(); + ClassLoader original = currentThread.getContextClassLoader(); try { - Thread.currentThread().setContextClassLoader(TagPluginManager.class.getClassLoader()); + currentThread.setContextClassLoader(TagPluginManager.class.getClassLoader()); parser = new TagPluginParser(ctxt, blockExternal); @@ -93,7 +94,7 @@ public class TagPluginManager { } catch (IOException | SAXException e) { throw new JasperException(e); } finally { - Thread.currentThread().setContextClassLoader(original); + currentThread.setContextClassLoader(original); } Map<String, String> plugins = parser.getPlugins(); diff --git a/java/org/apache/naming/ContextBindings.java b/java/org/apache/naming/ContextBindings.java index baf3ce2bdb..9c4895acc2 100644 --- a/java/org/apache/naming/ContextBindings.java +++ b/java/org/apache/naming/ContextBindings.java @@ -142,8 +142,9 @@ public class ContextBindings { throw new NamingException( sm.getString("contextBindings.unknownContext", obj)); } - threadBindings.put(Thread.currentThread(), context); - threadObjectBindings.put(Thread.currentThread(), obj); + Thread currentThread = Thread.currentThread(); + threadBindings.put(currentThread, context); + threadObjectBindings.put(currentThread, obj); } } @@ -156,8 +157,9 @@ public class ContextBindings { */ public static void unbindThread(Object obj, Object token) { if (ContextAccessController.checkSecurityToken(obj, token)) { - threadBindings.remove(Thread.currentThread()); - threadObjectBindings.remove(Thread.currentThread()); + Thread currentThread = Thread.currentThread(); + threadBindings.remove(currentThread); + threadObjectBindings.remove(currentThread); } } diff --git a/java/org/apache/tomcat/util/descriptor/tld/TldParser.java b/java/org/apache/tomcat/util/descriptor/tld/TldParser.java index df2e9c977a..56d159508d 100644 --- a/java/org/apache/tomcat/util/descriptor/tld/TldParser.java +++ b/java/org/apache/tomcat/util/descriptor/tld/TldParser.java @@ -47,9 +47,10 @@ public class TldParser { } public TaglibXml parse(TldResourcePath path) throws IOException, SAXException { - ClassLoader original = Thread.currentThread().getContextClassLoader(); + Thread currentThread = Thread.currentThread(); + ClassLoader original = currentThread.getContextClassLoader(); try (InputStream is = path.openStream()) { - Thread.currentThread().setContextClassLoader(TldParser.class.getClassLoader()); + currentThread.setContextClassLoader(TldParser.class.getClassLoader()); XmlErrorHandler handler = new XmlErrorHandler(); digester.setErrorHandler(handler); @@ -69,7 +70,7 @@ public class TldParser { return taglibXml; } finally { digester.reset(); - Thread.currentThread().setContextClassLoader(original); + currentThread.setContextClassLoader(original); } } diff --git a/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java b/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java index 1f4c8d5c8f..2c659b5d3a 100644 --- a/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java +++ b/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java @@ -2149,9 +2149,9 @@ public class ThreadPoolExecutor extends AbstractExecutorService { protected boolean currentThreadShouldBeStopped() { - if (threadRenewalDelay >= 0 - && Thread.currentThread() instanceof TaskThread) { - TaskThread currentTaskThread = (TaskThread) Thread.currentThread(); + Thread currentThread = Thread.currentThread(); + if (threadRenewalDelay >= 0 && currentThread instanceof TaskThread) { + TaskThread currentTaskThread = (TaskThread) currentThread; if (currentTaskThread.getCreationTime() < this.lastContextStoppedTime.longValue()) { return true; diff --git a/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java b/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java index c0e839fb3d..9d1220ac01 100644 --- a/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java +++ b/java/org/apache/tomcat/websocket/AsyncChannelGroupUtil.java @@ -72,11 +72,11 @@ public class AsyncChannelGroupUtil { private static AsynchronousChannelGroup createAsynchronousChannelGroup() { // Need to do this with the right thread context class loader else the // first web app to call this will trigger a leak - ClassLoader original = Thread.currentThread().getContextClassLoader(); + Thread currentThread = Thread.currentThread(); + ClassLoader original = currentThread.getContextClassLoader(); try { - Thread.currentThread().setContextClassLoader( - AsyncIOThreadFactory.class.getClassLoader()); + currentThread.setContextClassLoader(AsyncIOThreadFactory.class.getClassLoader()); // These are the same settings as the default // AsynchronousChannelGroup @@ -96,7 +96,7 @@ public class AsyncChannelGroupUtil { throw new IllegalStateException(sm.getString("asyncChannelGroup.createFail")); } } finally { - Thread.currentThread().setContextClassLoader(original); + currentThread.setContextClassLoader(original); } } diff --git a/java/org/apache/tomcat/websocket/server/WsFrameServer.java b/java/org/apache/tomcat/websocket/server/WsFrameServer.java index d29ea047aa..c40ae31095 100644 --- a/java/org/apache/tomcat/websocket/server/WsFrameServer.java +++ b/java/org/apache/tomcat/websocket/server/WsFrameServer.java @@ -123,24 +123,26 @@ public class WsFrameServer extends WsFrameBase { @Override protected void sendMessageText(boolean last) throws WsIOException { - ClassLoader cl = Thread.currentThread().getContextClassLoader(); + Thread currentThread = Thread.currentThread(); + ClassLoader cl = currentThread.getContextClassLoader(); try { - Thread.currentThread().setContextClassLoader(applicationClassLoader); + currentThread.setContextClassLoader(applicationClassLoader); super.sendMessageText(last); } finally { - Thread.currentThread().setContextClassLoader(cl); + currentThread.setContextClassLoader(cl); } } @Override protected void sendMessageBinary(ByteBuffer msg, boolean last) throws WsIOException { - ClassLoader cl = Thread.currentThread().getContextClassLoader(); + Thread currentThread = Thread.currentThread(); + ClassLoader cl = currentThread.getContextClassLoader(); try { - Thread.currentThread().setContextClassLoader(applicationClassLoader); + currentThread.setContextClassLoader(applicationClassLoader); super.sendMessageBinary(msg, last); } finally { - Thread.currentThread().setContextClassLoader(cl); + currentThread.setContextClassLoader(cl); } } diff --git a/test/org/apache/catalina/loader/TestWebappClassLoaderExecutorMemoryLeak.java b/test/org/apache/catalina/loader/TestWebappClassLoaderExecutorMemoryLeak.java index f54d604e00..805a126c6d 100644 --- a/test/org/apache/catalina/loader/TestWebappClassLoaderExecutorMemoryLeak.java +++ b/test/org/apache/catalina/loader/TestWebappClassLoaderExecutorMemoryLeak.java @@ -114,16 +114,15 @@ public class TestWebappClassLoaderExecutorMemoryLeak extends TomcatBaseTest { @Override public void run() { + Thread currentThread = Thread.currentThread(); try { - while (!Thread.currentThread().isInterrupted()) { + while (!currentThread.isInterrupted()) { Thread.sleep(20000); - System.out.println(Thread.currentThread().getClass() - + " [" + Thread.currentThread().getName() - + "] executing " + this._id); + System.out.println( + currentThread.getClass() + " [" + currentThread.getName() + "] executing " + this._id); } } catch (InterruptedException e) { - System.out.println(Thread.currentThread().getClass() + " [" - + Thread.currentThread().getName() + "] EXITING"); + System.out.println(currentThread.getClass() + " [" + currentThread.getName() + "] EXITING"); } } } diff --git a/test/org/apache/catalina/startup/TestTomcatClassLoader.java b/test/org/apache/catalina/startup/TestTomcatClassLoader.java index ff2bccd114..59cdbee4e6 100644 --- a/test/org/apache/catalina/startup/TestTomcatClassLoader.java +++ b/test/org/apache/catalina/startup/TestTomcatClassLoader.java @@ -54,10 +54,9 @@ public class TestTomcatClassLoader extends TomcatBaseTest { @Test public void testNonDefaultClassLoader() throws Exception { - ClassLoader cl = new URLClassLoader(new URL[0], - Thread.currentThread().getContextClassLoader()); - - Thread.currentThread().setContextClassLoader(cl); + Thread currentThread = Thread.currentThread(); + ClassLoader cl = new URLClassLoader(new URL[0], currentThread.getContextClassLoader()); + currentThread.setContextClassLoader(cl); Tomcat tomcat = getTomcatInstance(); tomcat.getServer().setParentClassLoader(cl); diff --git a/test/org/apache/juli/TestClassLoaderLogManager.java b/test/org/apache/juli/TestClassLoaderLogManager.java index 57426a370d..972d36b2ea 100644 --- a/test/org/apache/juli/TestClassLoaderLogManager.java +++ b/test/org/apache/juli/TestClassLoaderLogManager.java @@ -96,9 +96,10 @@ public class TestClassLoaderLogManager { @Test public void testBug66184() throws IOException { final ClassLoader cl = new TestClassLoader(); - final ClassLoader oldCL = Thread.currentThread().getContextClassLoader(); + final Thread currentThread = Thread.currentThread(); + final ClassLoader oldCL = currentThread.getContextClassLoader(); try { - Thread.currentThread().setContextClassLoader(cl); + currentThread.setContextClassLoader(cl); final ClassLoaderLogManager logManager = new ClassLoaderLogManager(); logManager.readConfiguration(); final Logger rootLogger = logManager.getLogger(""); @@ -106,7 +107,7 @@ public class TestClassLoaderLogManager { Assert.assertNull("root logger has a parent", rootLogger.getParent()); Assert.assertEquals(Level.INFO, rootLogger.getLevel()); } finally { - Thread.currentThread().setContextClassLoader(oldCL); + currentThread.setContextClassLoader(oldCL); } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org