manoj 99/03/21 02:42:36
Modified: pthreads/src/main http_main.c http_protocol.c
Log:
Make MaxRequestsPerChild work in the threaded server again (well at
least it works like the process server works). This consists of a few
changes:
- We need to actually count requests. In the pthreads port, we do this
by decrementing requests_this_child
- Send a SIGWINCH when we reach the accept_thread, to alert the rest of
the process to its eventual demise
- Temporarily comment out a SIG_IGN setting for SIGWINCH in
http_protocol.c. Otherwise, sigwait() won't see reliably see a
SIGWINCH, and the SIG_IGN isn't needed in a server with a
signal-handling thread anyway.
Revision Changes Path
1.63 +12 -0 apache-apr/pthreads/src/main/http_main.c
Index: http_main.c
===================================================================
RCS file: /home/cvs/apache-apr/pthreads/src/main/http_main.c,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -u -r1.62 -r1.63
--- http_main.c 1999/03/19 14:02:03 1.62
+++ http_main.c 1999/03/21 10:42:34 1.63
@@ -1804,6 +1804,7 @@
csd = -1;
}
else {
+ requests_this_child--;
csd = accept(sd, &sa_client, &len);
SAFE_ACCEPT(accept_mutex_off(my_tid - ap_threads_per_child));
}
@@ -1817,6 +1818,16 @@
}
}
}
+
+ /* Raise SIGWINCH so that all the actions that go with a gradual,
+ * graceful shutdown of the process get done.
+ *
+ * The reason this thread is actually going through the trouble to
+ * look up its own process ID is because under Red Hat 5.2, getpid()
+ * actually returns the "process ID" of the thread, since threads
+ * are just processes that share everything. I hope this is fixed in
+ * glibc 2.1 & Linux 2.2. - mvsk */
+ kill(ap_scoreboard_image->parent[my_pid].pid, SIGWINCH);
ap_update_child_status(my_pid, my_tid, SERVER_DEAD, (request_rec *)
NULL);
return NULL;
}
@@ -2146,6 +2157,7 @@
if (one_process) {
set_signals();
+ ap_scoreboard_image->parent[slot].pid = getpid();
child_main(slot);
}
1.13 +7 -0 apache-apr/pthreads/src/main/http_protocol.c
Index: http_protocol.c
===================================================================
RCS file: /home/cvs/apache-apr/pthreads/src/main/http_protocol.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -u -r1.12 -r1.13
--- http_protocol.c 1999/03/17 20:00:40 1.12
+++ http_protocol.c 1999/03/21 10:42:34 1.13
@@ -806,9 +806,16 @@
}
/* we've probably got something to do, ignore graceful restart requests
*/
+ /* XXX - sigwait doesn't work if the signal has been SIG_IGNed (under
+ * linux 2.0 w/ glibc 2.0, anyway), and this step isn't necessary when
+ * we're running a sigwait thread anyway. If/when unthreaded mode is put
+ * back in, we should make sure to ignore this signal iff a sigwait
thread
+ * isn't used. - mvsk
+
#ifdef SIGWINCH
signal(SIGWINCH, SIG_IGN);
#endif
+ */
ap_bsetflag(conn->client, B_SAFEREAD, 0);