apr_pollfd_t *pollset;
apr_status_t rv;
ap_listen_rec *lr, *last_lr = ap_listeners;
+ int have_idle_worker = 0;
free(ti);
}
if (listener_may_exit) break;
- rv = ap_queue_info_wait_for_idler(worker_queue_info,
- &recycled_pool);
- if (APR_STATUS_IS_EOF(rv)) {
- break; /* we've been signaled to die now */
- }
- else if (rv != APR_SUCCESS) {
- ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf,
- "apr_queue_info_wait failed. Attempting to shutdown "
- "process gracefully.");
- signal_threads(ST_GRACEFUL);
- break;
+ if (!have_idle_worker) {
+ rv = ap_queue_info_wait_for_idler(worker_queue_info,
+ &recycled_pool);
+ if (APR_STATUS_IS_EOF(rv)) {
+ break; /* we've been signaled to die now */
+ }
+ else if (rv != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf,
+ "apr_queue_info_wait failed. Attempting to "
+ " shutdown process gracefully.");
+ signal_threads(ST_GRACEFUL);
+ break;
+ }
+ have_idle_worker = 1;
}
+
/* We've already decremented the idle worker count inside
* ap_queue_info_wait_for_idler. */
ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf,
"ap_queue_push failed");
}
+ else {
+ have_idle_worker = 0;
+ }
}
}
else {
apr_pool_t *last_ptrans = NULL;
apr_pool_t *ptrans; /* Pool for per-transaction stuff */
apr_status_t rv;
+ int is_idle = 0;
free(ti);
bucket_alloc = apr_bucket_alloc_create(apr_thread_pool_get(thd));
while (!workers_may_exit) {
- rv = ap_queue_info_set_idle(worker_queue_info, last_ptrans);
- last_ptrans = NULL;
- if (rv != APR_SUCCESS) {
- ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf,
- "ap_queue_info_set_idle failed. Attempting to "
- "shutdown process gracefully.");
- signal_threads(ST_GRACEFUL);
- break;
+ if (!is_idle) {
+ rv = ap_queue_info_set_idle(worker_queue_info, last_ptrans);
+ last_ptrans = NULL;
+ if (rv != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf,
+ "ap_queue_info_set_idle failed. Attempting to "
+ "shutdown process gracefully.");
+ signal_threads(ST_GRACEFUL);
+ break;
+ }
+ is_idle = 1;
}
ap_update_child_status_from_indexes(process_slot, thread_slot, SERVER_READY, NULL);
}
continue;
}
+ is_idle = 0;
worker_sockets[thread_slot] = csd;
process_socket(ptrans, csd, process_slot, thread_slot, bucket_alloc);
worker_sockets[thread_slot] = NULL;