A little bird told me that FD_ZERO() burns lots of cycles in
apr_wait_for_io_or_timeout().  It turns out that this is an easy
conversion to poll(), which doesn't have such overhead in the
interface.

This works for me with some testing (timeouts on read and write work
for me).

--- /tmp/sendrecv.c     Wed Jul  3 07:19:33 2002
+++ network_io/unix/sendrecv.c  Wed Jul  3 06:42:41 2002
@@ -61,6 +61,33 @@
 
 apr_status_t apr_wait_for_io_or_timeout(apr_socket_t *sock, int for_read)
 {
+#ifdef HAVE_POLL
+    int rc, timeout;
+    struct pollfd fd;
+
+    if (sock->timeout < 0) {
+        timeout = -1;
+    }
+    else {
+        timeout = sock->timeout / 1000; /* convert usecs to msecs */
+    }
+
+    fd.fd = sock->socketdes;
+    fd.events = for_read ? POLLIN|POLLRDNORM|POLLRDBAND|POLLPRI :
+        POLLOUT;
+
+    do {
+        rc = poll(&fd, 1, timeout);
+    } while (rc == -1 && errno == EINTR);
+
+    if (rc == 0) {
+        return APR_TIMEUP;
+    }
+    else if (rc < 0) {
+        return errno;
+    }
+    return APR_SUCCESS;
+#else /* HAVE_POLL */
     struct timeval tv, *tvptr;
     fd_set fdset;
     int srv;
@@ -91,6 +118,7 @@
         return errno;
     }
     return APR_SUCCESS;
+#endif /* HAVE_POLL */
 }
 
 apr_status_t apr_send(apr_socket_t *sock, const char *buf, apr_size_t *len)
-- 
Jeff Trawick | [EMAIL PROTECTED]
Born in Roswell... married an alien...

Reply via email to