diff --git a/java/org/apache/tomcat/jni/SSL.java b/java/org/apache/tomcat/jni/SSL.java index b726a54..fb9fc16 100644 --- a/java/org/apache/tomcat/jni/SSL.java +++ b/java/org/apache/tomcat/jni/SSL.java @@ -388,4 +388,10 @@ public final class SSL { * @return true if all SSL_OP_* are supported by OpenSSL library. */ public static native boolean hasOp(int op); + + /** + * Cleanup thread specific data structures. This needs to be called after a thread + * has completed ssl operations. + */ + public static native void threadCleanup(); } diff --git a/java/org/apache/tomcat/util/net/AprEndpoint.java b/java/org/apache/tomcat/util/net/AprEndpoint.java index 74d813f..be208c4 100644 --- a/java/org/apache/tomcat/util/net/AprEndpoint.java +++ b/java/org/apache/tomcat/util/net/AprEndpoint.java @@ -2411,6 +2411,21 @@ public class AprEndpoint extends AbstractEndpoint { } + private abstract class BaseSocketProcessor implements Runnable { + @Override + public void run() { + try { + realRun(); + } finally { + if (isSSLEnabled()) { + SSL.threadCleanup(); + } + } + } + + protected abstract void realRun(); + } + // --------------------------------- SocketWithOptionsProcessor Inner Class /** @@ -2420,7 +2435,7 @@ public class AprEndpoint extends AbstractEndpoint { * * This is called after an accept(). */ - protected class SocketWithOptionsProcessor implements Runnable { + protected class SocketWithOptionsProcessor extends BaseSocketProcessor { protected SocketWrapper socket = null; @@ -2430,7 +2445,7 @@ public class AprEndpoint extends AbstractEndpoint { } @Override - public void run() { + public void realRun() { synchronized (socket) { if (!deferAccept) { @@ -2476,7 +2491,7 @@ public class AprEndpoint extends AbstractEndpoint { * This class is the equivalent of the Worker, but will simply use in an * external Executor thread pool. */ - protected class SocketProcessor implements Runnable { + protected class SocketProcessor extends BaseSocketProcessor { private final SocketWrapper socket; private final SocketStatus status; @@ -2492,7 +2507,7 @@ public class AprEndpoint extends AbstractEndpoint { } @Override - public void run() { + public void realRun() { // Upgraded connections need to allow multiple threads to access the // connection at the same time to enable blocking IO tobe used when