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]