rbb 99/08/09 10:58:12
Modified: apr/network_io/unix poll.c include apr_errno.h apr_network_io.h Log: Adding some new functions for poll. Will test them as soon as I fix Windows and ab_apr. Adding CVS: Revision Changes Path 1.16 +72 -0 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.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- poll.c 1999/07/29 19:23:25 1.15 +++ poll.c 1999/08/09 17:57:53 1.16 @@ -218,6 +218,51 @@ return APR_SUCCESS; } +/* ***APRDOC******************************************************** + * ap_status_t ap_remove_poll_socket(ap_pollfd_t *, ap_socket_t *, ap_int16_t) + * Add a socket to the poll structure. + * arg 1) The poll structure we will be using. + * arg 2) The socket to remove from the current poll structure. + * arg 3) The events to stop looking for during the poll. 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_remove_poll_socket(struct pollfd_t *aprset, + struct socket_t *sock, ap_int16_t events) +{ + ap_int16_t newevents; + int i = 0; + + while (i < aprset->curpos && aprset[i].sock->socketdes != 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; + } + + return APR_SUCCESS; +} + +/* ***APRDOC******************************************************** + * ap_status_t ap_clear_poll_socket(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: + * 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) +{ + aprset->curpos = 0; +} #else /* Use select to mimic poll */ ap_status_t ap_setup_poll(ap_context_t *cont, ap_int32_t num, struct pollfd_t ** @@ -330,6 +375,33 @@ } (*event) = revents; + return APR_SUCCESS; +} + +ap_status_t ap_remove_poll_socket(struct pollfd_t *aprset, + struct socket_t *sock, ap_int16_t events) +{ + if (event & APR_POLLIN) { + FD_CLR(sock->socketdes, aprset->read); + } + if (event & APR_POLLPRI) { + FD_CLR(sock->socketdes, aprset->read); + } + 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) +{ + FD_ZERO(aprset->read); + FD_ZERO(aprset->read); + FD_ZERO(aprset->write); + aprset->highsock = 0; return APR_SUCCESS; } 1.22 +1 -1 apache-apr/include/apr_errno.h Index: apr_errno.h =================================================================== RCS file: /home/cvs/apache-apr/include/apr_errno.h,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- apr_errno.h 1999/07/27 17:58:37 1.21 +++ apr_errno.h 1999/08/09 17:58:00 1.22 @@ -412,7 +412,7 @@ #define APR_BADCH 5012 #define APR_BADARG 5013 #define APR_EOF 5014 - +#define APR_NOTFOUND 5015 #ifdef __cplusplus } #endif 1.26 +2 -0 apache-apr/include/apr_network_io.h Index: apr_network_io.h =================================================================== RCS file: /home/cvs/apache-apr/include/apr_network_io.h,v retrieving revision 1.25 retrieving revision 1.26 diff -u -r1.25 -r1.26 --- apr_network_io.h 1999/06/22 16:57:38 1.25 +++ apr_network_io.h 1999/08/09 17:58:02 1.26 @@ -121,6 +121,8 @@ ap_status_t ap_setup_poll(ap_context_t *, ap_int32_t, ap_pollfd_t **); ap_status_t ap_poll(ap_pollfd_t *, ap_int32_t *, ap_int32_t); ap_status_t ap_add_poll_socket(ap_pollfd_t *, ap_socket_t *, ap_int16_t); +ap_status_t ap_remove_poll_socket(ap_pollfd_t *, ap_socket_t *, ap_int16_t); +ap_status_t ap_clear_poll_sockets(ap_pollfd_t *); ap_status_t ap_get_revents(ap_pollfd_t *, ap_socket_t *, ap_int16_t *); ap_status_t ap_get_polldata(ap_pollfd_t *, void *); ap_status_t ap_set_polldata(ap_pollfd_t *, void *);