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; }