]> granicus.if.org Git - apache/commitdiff
Rework OS/2 MPM to use the pollset API.
authorBrian Havard <bjh@apache.org>
Thu, 20 Nov 2003 22:28:15 +0000 (22:28 +0000)
committerBrian Havard <bjh@apache.org>
Thu, 20 Nov 2003 22:28:15 +0000 (22:28 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@101826 13f79535-47bb-0310-9956-ffa450edef68

server/mpm/mpmt_os2/mpmt_os2_child.c

index 25c202e8b9151a7ea73216cffcfadc2839f8a3c3..ae79550dba63ab6d30da51c0de4e3e502068c753 100644 (file)
@@ -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++;
             }
         }