Author: mturk
Date: Thu Oct 23 23:42:01 2008
New Revision: 707561

URL: http://svn.apache.org/viewvc?rev=707561&view=rev
Log:
Ensure that maintain cannot be executed by multiple threads if maintain takes 
longer then maintain_time

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=707561&r1=707560&r2=707561&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_worker.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_worker.c Thu Oct 23 23:42:01 
2008
@@ -305,18 +305,28 @@
 void wc_maintain(jk_logger_t *l)
 {
     static time_t last_maintain = 0;
+    static int    running_maintain = 0;
     int sz = jk_map_size(worker_map);
 
     JK_TRACE_ENTER(l);
 
     if (sz > 0 && worker_maintain_time > 0) {
         int i;
-        time_t now;
+
         JK_ENTER_CS(&worker_lock, i);
-        now = time(NULL);
-        if (difftime(now, last_maintain) >= worker_maintain_time) {
-            last_maintain = now;
+        if (running_maintain) {
+            /* 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);
+
             for (i = 0; i < sz; i++) {
                 jk_worker_t *w = jk_map_value_at(worker_map, i);
                 if (w && w->maintain) {
@@ -324,9 +334,13 @@
                         jk_log(l, JK_LOG_DEBUG,
                                "Maintaining worker %s",
                                jk_map_name_at(worker_map, i));
-                    w->maintain(w, now, l);
+                    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);



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

Reply via email to