You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by bj...@apache.org on 2003/11/20 23:28:15 UTC

cvs commit: httpd-2.0/server/mpm/mpmt_os2 mpmt_os2_child.c

bjh         2003/11/20 14:28:15

  Modified:    server/mpm/mpmt_os2 mpmt_os2_child.c
  Log:
  Rework OS/2 MPM to use the pollset API.
  
  Revision  Changes    Path
  1.27      +21 -38    httpd-2.0/server/mpm/mpmt_os2/mpmt_os2_child.c
  
  Index: mpmt_os2_child.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/server/mpm/mpmt_os2/mpmt_os2_child.c,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- mpmt_os2_child.c	3 Sep 2003 19:27:11 -0000	1.26
  +++ mpmt_os2_child.c	20 Nov 2003 22:28:15 -0000	1.27
  @@ -134,15 +134,13 @@
   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 @@
           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 @@
           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 @@
               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++;
               }
           }