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