From: Brian Havard Date: Thu, 20 Nov 2003 22:28:15 +0000 (+0000) Subject: Rework OS/2 MPM to use the pollset API. X-Git-Tag: pre_ajp_proxy~1030 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=eeb0224f0235ca220296d0f2f41ce3814f72a2df;p=apache Rework OS/2 MPM to use the pollset API. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@101826 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/server/mpm/mpmt_os2/mpmt_os2_child.c b/server/mpm/mpmt_os2/mpmt_os2_child.c index 25c202e8b9..ae79550dba 100644 --- a/server/mpm/mpmt_os2/mpmt_os2_child.c +++ b/server/mpm/mpmt_os2/mpmt_os2_child.c @@ -134,15 +134,13 @@ static void clean_child_exit(int code) void ap_mpm_child_main(apr_pool_t *pconf) { ap_listen_rec *lr = NULL; - ap_listen_rec *first_lr = NULL; int requests_this_child = 0; - apr_socket_t *sd = ap_listeners->sd; - int nsds, rv = 0; + int rv = 0; unsigned long ulTimes; int my_pid = getpid(); ULONG rc, c; HQUEUE workq; - apr_pollfd_t *pollset; + apr_pollset_t *pollset; int num_listeners; TID server_maint_tid; void *sb_mem; @@ -223,16 +221,23 @@ void ap_mpm_child_main(apr_pool_t *pconf) num_listeners++; } - apr_poll_setup(&pollset, num_listeners, pchild); + apr_pollset_create(&pollset, num_listeners, pchild, 0); - for (lr = ap_listeners; lr; lr = lr->next) { - apr_poll_socket_add(pollset, lr->sd, APR_POLLIN); + 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; + apr_pollset_add(pollset, &pfd); } /* Main connection accept loop */ do { apr_pool_t *pconn; worker_args_t *worker_args; + int last_poll_idx = 0; apr_pool_create(&pconn, pchild); worker_args = apr_palloc(pconn, sizeof(worker_args_t)); @@ -241,6 +246,9 @@ void ap_mpm_child_main(apr_pool_t *pconf) if (num_listeners == 1) { rv = apr_socket_accept(&worker_args->conn_sd, ap_listeners->sd, pconn); } else { + const apr_pollfd_t *poll_results; + apr_int32_t num_poll_results; + rc = DosRequestMutexSem(ap_mpm_accept_mutex, SEM_INDEFINITE_WAIT); if (shutdown_pending) { @@ -251,43 +259,18 @@ void ap_mpm_child_main(apr_pool_t *pconf) rv = APR_FROM_OS_ERROR(rc); if (rv == APR_SUCCESS) { - rv = apr_poll(pollset, num_listeners, &nsds, -1); + rv = apr_pollset_poll(pollset, -1, &num_poll_results, &poll_results); DosReleaseMutexSem(ap_mpm_accept_mutex); } if (rv == APR_SUCCESS) { - if (first_lr == NULL) { - first_lr = ap_listeners; - } - - lr = first_lr; - - do { - apr_int16_t event; - - apr_poll_revents_get(&event, lr->sd, pollset); - - if (event == APR_POLLIN) { - apr_sockaddr_t *sa; - apr_port_t port; - apr_socket_addr_get(&sa, APR_LOCAL, lr->sd); - apr_sockaddr_port_get(&port, sa); - first_lr = lr->next; - break; - } - lr = lr->next; - - if (!lr) { - lr = ap_listeners; - } - } while (lr != first_lr); - - if (lr == first_lr) { - continue; + if (last_poll_idx >= num_listeners) { + last_poll_idx = 0; } - sd = lr->sd; - rv = apr_socket_accept(&worker_args->conn_sd, sd, pconn); + lr = poll_results[last_poll_idx++].client_data; + rv = apr_socket_accept(&worker_args->conn_sd, lr->sd, pconn); + last_poll_idx++; } }