Author: mturk
Date: Fri Sep 17 10:59:29 2010
New Revision: 998068

URL: http://svn.apache.org/viewvc?rev=998068&view=rev
Log:
Close sockets outside of critical section

Modified:
    tomcat/jk/trunk/native/common/jk_ajp_common.c

Modified: tomcat/jk/trunk/native/common/jk_ajp_common.c
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_ajp_common.c?rev=998068&r1=998067&r2=998068&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_ajp_common.c (original)
+++ tomcat/jk/trunk/native/common/jk_ajp_common.c Fri Sep 17 10:59:29 2010
@@ -3177,11 +3177,14 @@ int JK_METHOD ajp_maintain(jk_worker_t *
         if (rc) {
             unsigned int n = 0, k = 0, cnt = 0;
             int i;
+            unsigned int m, m_count = 0;
+            jk_sock_t   *m_sock;
             /* Count open slots */
             for (i = (int)aw->ep_cache_sz - 1; i >= 0; i--) {
                 if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd))
                     cnt++;
             }
+            m_sock = (jk_sock_t *)malloc((cnt + 1) * sizeof(jk_sock_t));
             /* Handle worker cache timeouts */
             if (aw->cache_timeout > 0) {
                 for (i = (int)aw->ep_cache_sz - 1;
@@ -3195,6 +3198,8 @@ int JK_METHOD ajp_maintain(jk_worker_t *
                             if (JK_IS_DEBUG_LEVEL(l))
                                 rt = time(NULL);
                             aw->ep_cache[i]->reuse = JK_FALSE;
+                            m_sock[m_count++] = aw->ep_cache[i]->sd;
+                            aw->ep_cache[i]->sd = JK_INVALID_SOCKET;
                             ajp_reset_endpoint(aw->ep_cache[i], l);
                             if (JK_IS_DEBUG_LEVEL(l))
                                 jk_log(l, JK_LOG_DEBUG,
@@ -3232,6 +3237,8 @@ int JK_METHOD ajp_maintain(jk_worker_t *
                                        aw->ep_cache[i]->sd,
                                        aw->ep_cache[i]->last_errno);
                                 aw->ep_cache[i]->reuse = JK_FALSE;
+                                m_sock[m_count++] = aw->ep_cache[i]->sd;
+                                aw->ep_cache[i]->sd = JK_INVALID_SOCKET;
                                 ajp_reset_endpoint(aw->ep_cache[i], l);
                             }
                             else {
@@ -3243,6 +3250,14 @@ int JK_METHOD ajp_maintain(jk_worker_t *
                 }
             }
             JK_LEAVE_CS(&aw->cs, rc);
+            /* Shutdown sockets outside of the lock.
+             * This has benefits only if maintain was
+             * called from the watchdog thread.
+             */
+            for (m = 0; m < m_count; m++) {
+                jk_shutdown_socket(m_sock[m], l);
+            }
+            free(m_sock);
             if (n && JK_IS_DEBUG_LEVEL(l))
                 jk_log(l, JK_LOG_DEBUG,
                         "recycled %u sockets in %d seconds from %u pool slots",



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to