rbb         99/08/09 13:21:08

  Modified:    apr/network_io/unix networkio.h poll.c
  Log:
  reworked the unix poll code.  This now works with ab_apr.  The numbers
  returned from ab are WAY off on all platforms, but at least it is connecting
  everywhere.  :)
  
  Revision  Changes    Path
  1.12      +3 -3      apache-apr/apr/network_io/unix/networkio.h
  
  Index: networkio.h
  ===================================================================
  RCS file: /home/cvs/apache-apr/apr/network_io/unix/networkio.h,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- networkio.h       1999/06/16 11:15:58     1.11
  +++ networkio.h       1999/08/09 20:21:06     1.12
  @@ -71,7 +71,7 @@
   struct pollfd_t {
       ap_context_t *cntxt;
   #ifdef HAVE_POLL
  -    struct socket_t *sock;
  +    int *sock;
       int curpos;
   #else
       fd_set *read;
  @@ -79,8 +79,8 @@
       fd_set *except;
       int highsock;
   #endif
  -    ap_int16_t events;
  -    ap_int16_t revents;
  +    ap_int16_t *events;
  +    ap_int16_t *revents;
   
   };
   
  
  
  
  1.17      +45 -28    apache-apr/apr/network_io/unix/poll.c
  
  Index: poll.c
  ===================================================================
  RCS file: /home/cvs/apache-apr/apr/network_io/unix/poll.c,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- poll.c    1999/08/09 17:57:53     1.16
  +++ poll.c    1999/08/09 20:21:06     1.17
  @@ -71,7 +71,11 @@
    */
   ap_status_t ap_setup_poll(ap_context_t *cont, ap_int32_t num, struct 
pollfd_t **new)
   {
  -    (*new) = (struct pollfd_t *)ap_palloc(cont, sizeof(struct pollfd_t) * 
num);
  +    (*new) = (struct pollfd_t *)ap_palloc(cont, sizeof(struct pollfd_t));
  +    (*new)->sock = ap_palloc(cont, sizeof(struct socket_t) * num);
  +    (*new)->events = ap_palloc(cont, sizeof(ap_int16_t) * num);
  +    (*new)->revents = ap_palloc(cont, sizeof(ap_int16_t) * num);
  +
       if ((*new) == NULL) {
           return APR_ENOMEM;
       }
  @@ -135,14 +139,14 @@
   {
       int i = 0;
       
  -    while (i < aprset->curpos && aprset[i].sock->socketdes != 
sock->socketdes) {
  +    while (i < aprset->curpos && aprset->sock[i] != sock->socketdes) {
           i++;
       }
       if (i >= aprset->curpos) {
           aprset->curpos++;
       } 
  -    aprset[i].sock = sock;
  -    aprset[i].events = get_event(event);
  +    aprset->sock[i] = sock->socketdes;
  +    aprset->events[i] = get_event(event);
   
       return APR_SUCCESS;
   }
  @@ -169,8 +173,8 @@
                                            sizeof(struct pollfd) * (*nsds));
   
       for (i = 0; i < (*nsds); i++) {
  -        pollset[i].fd = aprset[i].sock->socketdes;
  -        pollset[i].events = aprset[i].events;
  +        pollset[i].fd = aprset->sock[i];
  +        pollset[i].events = aprset->events[i];
       }
   
       if (timeout != -1) {
  @@ -181,7 +185,7 @@
       (*nsds) = rv;
       
       for (i = 0; i < (*nsds); i++) {
  -        aprset[i].revents = get_revent(pollset[i].revents);
  +        aprset->revents[i] = get_revent(pollset[i].revents);
       }
       
       if ((*nsds) < 0) {
  @@ -208,13 +212,13 @@
   {
       int i = 0;
       
  -    while (i < aprset->curpos && aprset[i].sock->socketdes != 
sock->socketdes) {
  +    while (i < aprset->curpos && aprset->sock[i] != sock->socketdes) {
           i++;
       }
       if (i >= aprset->curpos) {
           return APR_INVALSOCK;
       } 
  -    (*event) = aprset[i].revents;
  +    (*event) = aprset->revents[i];
       return APR_SUCCESS;
   }
   
  @@ -234,35 +238,46 @@
       ap_int16_t newevents;
       int i = 0;
       
  -    while (i < aprset->curpos && aprset[i].sock->socketdes != 
sock->socketdes) {
  +    while (i < aprset->curpos && aprset->sock[i] != sock->socketdes) {
           i++;
       }
       if (i >= aprset->curpos) {
           return APR_NOTFOUND;
       } 
  -    aprset[i].sock = sock;
       newevents = get_event(events);
  -    if (aprset[i].events & newevents) {
  -        aprset[i].events ^= newevents;
  +    if (aprset->events[i] & newevents) {
  +        aprset->events[i] ^= newevents;
       }
   
       return APR_SUCCESS;
   }
   
   /* ***APRDOC********************************************************
  - * ap_status_t ap_clear_poll_socket(ap_pollfd_t *)
  + * ap_status_t ap_clear_poll_sockets(ap_pollfd_t *)
    *    Remove all sockets from the poll structure. 
    * arg 1) The poll structure we will be using. 
  - * arg 2) The socket to add to the current poll structure. 
  - * arg 3) The events to look for when we do the poll.  One of:
  + * arg 3) The events to clear from all sockets.  One of:
    *            APR_POLLIN    -- signal if read will not block
    *            APR_POLLPRI   -- signal if prioirty data is availble to be read
    *            APR_POLLOUT   -- signal if write will not block
    */
  -ap_status_t ap_clear_poll_sockets(struct pollfd_t *aprset)
  +ap_status_t ap_clear_poll_sockets(struct pollfd_t *aprset, ap_int16_t events)
   {
  -    aprset->curpos = 0; 
  +    int i = 0;
  +    ap_int16_t newevents;
  +
  +    newevents = get_event(events);
  +
  +    while (i < aprset->curpos) {
  +        if (aprset->events[i] & newevents) {
  +            aprset->events[i] ^= newevents;
  +        }
  +
  +        return APR_SUCCESS;
  +        i++;
  +    }
   }
  +
   #else    /* Use select to mimic poll */
   
   ap_status_t ap_setup_poll(ap_context_t *cont, ap_int32_t num, struct 
pollfd_t **
  @@ -312,9 +327,8 @@
       else {
           /* Convert milli-seconds into seconds and micro-seconds. */
           thetime = (struct timeval *)ap_palloc(aprset->cntxt, sizeof(struct 
timeval));
  -        thetime->tv_sec = timeout / (1000);
  -        timeout = timeout % 1000;
  -        thetime->tv_usec = timeout * 1000;
  +        thetime->tv_sec = timeout;
  +        thetime->tv_usec = 0;
       }
   
       rv = select(aprset->highsock + 1, aprset->read, aprset->write, 
  @@ -390,17 +404,20 @@
       if (event & APR_POLLOUT) {
           FD_CLR(sock->socketdes, aprset->write);
       }
  -    if (sock->socketdes > aprset->highsock) {
  -        aprset->highsock = sock->socketdes;
  -    }
       return APR_SUCCESS;
   }
   
  -ap_status_t ap_clear_poll_sockets(struct pollfd_t *aprset)
  +ap_status_t ap_clear_poll_sockets(struct pollfd_t *aprset, ap_int16_t event)
   {
  -    FD_ZERO(aprset->read);
  -    FD_ZERO(aprset->read);
  -    FD_ZERO(aprset->write);
  +    if (event & APR_POLLIN) {
  +        FD_ZERO(aprset->read);
  +    }
  +    if (event & APR_POLLPRI) {
  +        FD_ZERO(aprset->read);
  +    }
  +    if (event & APR_POLLOUT) {
  +        FD_ZERO(aprset->write);
  +    }
       aprset->highsock = 0;
       return APR_SUCCESS;
   }
  
  
  

Reply via email to