static int workers_may_exit = 0;
static int start_thread_may_exit = 0;
static int listener_may_exit = 0;
-static int requests_this_child;
+static int conns_this_child;
static int num_listensocks = 0;
static apr_uint32_t connection_count = 0;
static int resource_shortage = 0;
{
apr_status_t rv;
- cs->c->sbh = NULL; /* prevent scoreboard updates from the listener
- * worker will loop around soon and set SERVER_READY
- */
-
if (ap_start_lingering_close(cs->c)) {
apr_pool_clear(cs->p);
ap_push_pool(worker_queue_info, cs->p);
ap_equeue_writer_onward(eq);
apr_pollset_wakeup(event_pollset);
}
+
+ /*
+ * Prevent this connection from writing to our connection state after it
+ * is no longer associated with this thread. This would happen if the EOR
+ * bucket is destroyed from the listener thread due to a connection abort
+ * or timeout.
+ */
+ c->sbh = NULL;
+
return 1;
}
-/* requests_this_child has gone to zero or below. See if the admin coded
+/* conns_this_child has gone to zero or below. See if the admin coded
"MaxConnectionsPerChild 0", and keep going in that case. Doing it this way
simplifies the hot path in worker_thread */
static void check_infinite_requests(void)
signal_threads(ST_GRACEFUL);
}
else {
- requests_this_child = INT_MAX; /* keep going */
+ conns_this_child = INT_MAX; /* keep going */
}
}
break;
}
- if (requests_this_child <= 0) {
+ if (conns_this_child <= 0) {
check_infinite_requests();
}
worker_sockets[thread_slot] = csd;
rv = process_socket(thd, ptrans, csd, cs, eq, process_slot, thread_slot);
if (!rv) {
- requests_this_child--;
+ conns_this_child--;
}
worker_sockets[thread_slot] = NULL;
}
}
if (ap_max_requests_per_child) {
- requests_this_child = ap_max_requests_per_child;
+ conns_this_child = ap_max_requests_per_child;
}
else {
/* coding a value of zero means infinity */
- requests_this_child = INT_MAX;
+ conns_this_child = INT_MAX;
}
/* Setup worker threads */