Author: rjung
Date: Sun Oct 26 11:27:44 2008
New Revision: 708019

URL: http://svn.apache.org/viewvc?rev=708019&view=rev
Log:
Modify concurrency stopper for wc_maintain a bit.
We call wc_maintain during each request,
so let's do the cheap time tests before acquiring a lock.

Modified:
    tomcat/connectors/trunk/jk/native/common/jk_worker.c

Modified: tomcat/connectors/trunk/jk/native/common/jk_worker.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_worker.c?rev=708019&r1=708018&r2=708019&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_worker.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_worker.c Sun Oct 26 11:27:44 
2008
@@ -310,41 +310,42 @@
 
     JK_TRACE_ENTER(l);
 
-    if (sz > 0 && worker_maintain_time > 0) {
+    /* Only proceed if all of the below hold true:
+     * - there are workers
+     * - maintenance wasn't disabled by configuration
+     * - time since last maintenance is big enough
+     */
+    if (sz > 0 && worker_maintain_time > 0 &&
+        difftime(time(NULL), last_maintain) >= worker_maintain_time) {
         int i;
-
         JK_ENTER_CS(&worker_lock, i);
-        if (running_maintain) {
+        if (running_maintain ||
+            difftime(time(NULL), last_maintain) < worker_maintain_time) {
             /* Already in maintain */
             JK_LEAVE_CS(&worker_lock, i);
             JK_TRACE_EXIT(l);
             return;
         }
-        if (difftime(time(NULL), last_maintain) >= worker_maintain_time) {
-            /* Set the maintain run flag so other threads skip
-             * the maintain until we are finished.
-             */
-            running_maintain = 1;
-            JK_LEAVE_CS(&worker_lock, i);
+        /* Set the maintain run flag so other threads skip
+         * the maintain until we are finished.
+         */
+        running_maintain = 1;
+        JK_LEAVE_CS(&worker_lock, i);
 
-            for (i = 0; i < sz; i++) {
-                jk_worker_t *w = jk_map_value_at(worker_map, i);
-                if (w && w->maintain) {
-                    if (JK_IS_DEBUG_LEVEL(l))
-                        jk_log(l, JK_LOG_DEBUG,
-                               "Maintaining worker %s",
-                               jk_map_name_at(worker_map, i));
-                    w->maintain(w, time(NULL), l);
-                }
+        for (i = 0; i < sz; i++) {
+            jk_worker_t *w = jk_map_value_at(worker_map, i);
+            if (w && w->maintain) {
+                if (JK_IS_DEBUG_LEVEL(l))
+                    jk_log(l, JK_LOG_DEBUG,
+                           "Maintaining worker %s",
+                           jk_map_name_at(worker_map, i));
+                w->maintain(w, time(NULL), l);
             }
-            JK_ENTER_CS(&worker_lock, i);
-            last_maintain = time(NULL);
-            running_maintain = 0;
-            JK_LEAVE_CS(&worker_lock, i);
-        }
-        else {
-            JK_LEAVE_CS(&worker_lock, i);
         }
+        JK_ENTER_CS(&worker_lock, i);
+        last_maintain = time(NULL);
+        running_maintain = 0;
+        JK_LEAVE_CS(&worker_lock, i);
     }
     JK_TRACE_EXIT(l);
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to