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

Reply via email to