You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by tr...@apache.org on 2003/12/13 19:25:57 UTC
cvs commit: httpd-2.0/server/mpm/experimental/threadpool threadpool.c
trawick 2003/12/13 10:25:57
Modified: server/mpm/experimental/threadpool threadpool.c
Log:
update threadpool MPM to build and appear to work with the current APR
pollset API
Revision Changes Path
1.22 +45 -26 httpd-2.0/server/mpm/experimental/threadpool/threadpool.c
Index: threadpool.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/mpm/experimental/threadpool/threadpool.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- threadpool.c 24 Nov 2003 01:34:04 -0000 1.21
+++ threadpool.c 13 Dec 2003 18:25:57 -0000 1.22
@@ -779,18 +779,29 @@
int process_slot = ti->pid;
apr_pool_t *tpool = apr_thread_pool_get(thd);
void *csd = NULL;
- apr_pool_t *ptrans; /* Pool for per-transaction stuff */
- int n;
- apr_pollfd_t *pollset;
+ apr_pool_t *ptrans = NULL; /* Pool for per-transaction stuff */
+ apr_pollset_t *pollset;
apr_status_t rv;
- ap_listen_rec *lr, *last_lr = ap_listeners;
+ ap_listen_rec *lr;
worker_wakeup_info *worker = NULL;
+ int last_poll_idx = 0;
free(ti);
- apr_poll_setup(&pollset, num_listensocks, tpool);
- for(lr = ap_listeners ; lr != NULL ; lr = lr->next)
- apr_poll_socket_add(pollset, lr->sd, APR_POLLIN);
+ /* ### check the status */
+ (void) apr_pollset_create(&pollset, num_listensocks, tpool, 0);
+
+ for (lr = ap_listeners; lr != NULL; lr = lr->next) {
+ apr_pollfd_t pfd = { 0 };
+
+ pfd.desc_type = APR_POLL_SOCKET;
+ pfd.desc.s = lr->sd;
+ pfd.reqevents = APR_POLLIN;
+ pfd.client_data = lr;
+
+ /* ### check the status */
+ (void) apr_pollset_add(pollset, &pfd);
+ }
/* Unblock the signal used to wake this thread up, and set a handler for
* it.
@@ -846,40 +857,48 @@
else {
while (!listener_may_exit) {
apr_status_t ret;
- apr_int16_t event;
+ apr_int32_t numdesc;
+ const apr_pollfd_t *pdesc;
- ret = apr_poll(pollset, num_listensocks, &n, -1);
+ ret = apr_pollset_poll(pollset, -1, &numdesc, &pdesc);
if (ret != APR_SUCCESS) {
if (APR_STATUS_IS_EINTR(ret)) {
continue;
}
- /* apr_poll() will only return errors in catastrophic
+ /* apr_pollset_poll() will only return errors in catastrophic
* circumstances. Let's try exiting gracefully, for now. */
ap_log_error(APLOG_MARK, APLOG_ERR, ret, (const server_rec *)
- ap_server_conf, "apr_poll: (listen)");
+ ap_server_conf, "apr_pollset_poll: (listen)");
signal_threads(ST_GRACEFUL);
}
if (listener_may_exit) break;
- /* find a listener */
- lr = last_lr;
- do {
- lr = lr->next;
- if (lr == NULL) {
- lr = ap_listeners;
- }
- /* XXX: Should we check for POLLERR? */
- apr_poll_revents_get(&event, lr->sd, pollset);
- if (event & APR_POLLIN) {
- last_lr = lr;
- goto got_fd;
- }
- } while (lr != last_lr);
+ /* We can always use pdesc[0], but sockets at position N
+ * could end up completely starved of attention in a very
+ * busy server. Therefore, we round-robin across the
+ * returned set of descriptors. While it is possible that
+ * the returned set of descriptors might flip around and
+ * continue to starve some sockets, we happen to know the
+ * internal pollset implementation retains ordering
+ * stability of the sockets. Thus, the round-robin should
+ * ensure that a socket will eventually be serviced.
+ */
+ if (last_poll_idx >= numdesc)
+ last_poll_idx = 0;
+
+ /* Grab a listener record from the client_data of the poll
+ * descriptor, and advance our saved index to round-robin
+ * the next fetch.
+ *
+ * ### hmm... this descriptor might have POLLERR rather
+ * ### than POLLIN
+ */
+ lr = pdesc[last_poll_idx++].client_data;
+ break;
}
}
- got_fd:
if (!listener_may_exit) {
rv = lr->accept_func(&csd, lr, ptrans);
/* later we trash rv and rely on csd to indicate success/failure */
Re: cvs commit: httpd-2.0/server/mpm/experimental/threadpool threadpool.c
Posted by Greg Stein <gs...@lyra.org>.
On Sat, Dec 13, 2003 at 06:25:57PM -0000, trawick@apache.org wrote:
> trawick 2003/12/13 10:25:57
>
> Modified: server/mpm/experimental/threadpool threadpool.c
> Log:
> update threadpool MPM to build and appear to work with the current APR
> pollset API
aaaaahhh. Thanks for this. When I tossed the old poll API, in favor of
pollset, I fixed the code that was "non-experimental" and that I could
test on my platform (e.g. left behind netware, beos, os/2, etc). I figured
the people who were working with the experimental code could be
responsible for getting it updated.
Thanks,
-g
--
Greg Stein, http://www.lyra.org/