rbb 99/06/16 04:16:08
Modified: apr configure.in
apr/network_io/unix networkio.h poll.c
apr/test ab_apr.c testsock.c
Log:
Changes to put select based poll into the code. If the platform doesn't
support
poll, it will compile and run now anyway.
Revision Changes Path
1.21 +1 -1 apache-apr/apr/configure.in
Index: configure.in
===================================================================
RCS file: /home/cvs/apache-apr/apr/configure.in,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- configure.in 1999/06/15 19:43:03 1.20
+++ configure.in 1999/06/16 11:15:56 1.21
@@ -162,7 +162,7 @@
AC_FUNC_SETPGRP
dnl Checks for library functions.
-AC_CHECK_FUNCS(strcasecmp stricmp)
+AC_CHECK_FUNCS(strcasecmp stricmp poll)
dnl Start building stuff from our information
AC_SUBST(LDLIBS)
1.11 +9 -1 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.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- networkio.h 1999/06/14 12:43:10 1.10
+++ networkio.h 1999/06/16 11:15:58 1.11
@@ -70,10 +70,18 @@
struct pollfd_t {
ap_context_t *cntxt;
+#ifdef HAVE_POLL
struct socket_t *sock;
+ int curpos;
+#else
+ fd_set *read;
+ fd_set *write;
+ fd_set *except;
+ int highsock;
+#endif
ap_int16_t events;
ap_int16_t revents;
- int curpos;
+
};
ap_int16_t get_event(ap_int16_t);
1.13 +118 -1 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.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- poll.c 1999/06/14 12:43:10 1.12
+++ poll.c 1999/06/16 11:15:59 1.13
@@ -60,6 +60,7 @@
#include <errno.h>
#include <sys/poll.h>
+#ifdef HAVE_POLL /* We can just use poll to do our socket polling. */
ap_status_t ap_setup_poll(ap_context_t *cont, ap_int32_t num, struct
pollfd_t **new)
{
@@ -173,4 +174,120 @@
(*event) = aprset[i].revents;
return APR_SUCCESS;
}
-
+
+#else /* Use select to mimic poll */
+
+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);
+ if ((*new) == NULL) {
+ return APR_ENOMEM;
+ }
+ (*new)->cntxt = cont;
+ (*new)->read = (fd_set *)ap_palloc(cont, sizeof(fd_set));
+ (*new)->write = (fd_set *)ap_palloc(cont, sizeof(fd_set));
+ (*new)->except = (fd_set *)ap_palloc(cont, sizeof(fd_set));
+ FD_ZERO((*new)->read);
+ FD_ZERO((*new)->write);
+ FD_ZERO((*new)->except);
+ (*new)->highsock = -1;
+ return APR_SUCCESS;
+}
+
+ap_status_t ap_add_poll_socket(struct pollfd_t *aprset,
+ struct socket_t *sock, ap_int16_t event)
+{
+ if (event & APR_POLLIN) {
+ FD_SET(sock->socketdes, aprset->read);
+ }
+ if (event & APR_POLLPRI) {
+ FD_SET(sock->socketdes, aprset->read);
+ }
+ if (event & APR_POLLOUT) {
+ FD_SET(sock->socketdes, aprset->write);
+ }
+ if (sock->socketdes > aprset->highsock) {
+ aprset->highsock = sock->socketdes;
+ }
+ return APR_SUCCESS;
+}
+
+ap_status_t ap_poll(struct pollfd_t *aprset, ap_int32_t *nsds, ap_int32_t
timeout)
+{
+ int rv;
+ struct timeval *thetime;
+
+ if (timeout == -1) {
+ thetime = NULL;
+ }
+ 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;
+ }
+
+ rv = select(aprset->highsock + 1, aprset->read, aprset->write,
+ aprset->except, thetime);
+
+ (*nsds) = rv;
+ if ((*nsds) == 0) {
+ return APR_TIMEUP;
+ }
+ if ((*nsds) < 0) {
+ return APR_EEXIST;
+ }
+ return APR_SUCCESS;
+}
+
+ap_status_t ap_get_revents(struct pollfd_t *aprset, struct socket_t *sock,
ap_int16_t *event)
+{
+ ap_int16_t revents = 0;
+ char data[256];
+ int dummy = 256;
+ int flags = MSG_PEEK;
+
+ /* We just want to PEEK at the data, so I am setting up a dummy WSABUF
+ * variable here.
+ */
+ if (FD_ISSET(sock->socketdes, aprset->read)) {
+ revents |= APR_POLLIN;
+ if (recv(sock->socketdes, &data, dummy, flags) == -1) {
+ switch (errno) {
+ case ECONNRESET:
+ case ECONNABORTED:
+ case ESHUTDOWN:
+ case ENETRESET: {
+ revents ^= APR_POLLIN;
+ revents |= APR_POLLHUP;
+ break;
+ }
+ case ENOTSOCK: {
+ revents ^= APR_POLLIN;
+ revents |= APR_POLLNVAL;
+ }
+ default: {
+ revents ^= APR_POLLIN;
+ revents |= APR_POLLERR;
+ }
+ }
+ }
+ }
+ if (FD_ISSET(sock->socketdes, aprset->write)) {
+ revents |= APR_POLLOUT;
+ }
+ /* I am assuming that the except is for out of band data, not a failed
+ * connection on a non-blocking socket. Might be a bad assumption, but
+ * it works for now. rbb.
+ */
+ if (FD_ISSET(sock->socketdes, aprset->except)) {
+ revents |= APR_POLLPRI;
+ }
+
+ (*event) = revents;
+ return APR_SUCCESS;
+}
+
+#endif
1.13 +3 -3 apache-apr/apr/test/ab_apr.c
Index: ab_apr.c
===================================================================
RCS file: /home/cvs/apache-apr/apr/test/ab_apr.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- ab_apr.c 1999/05/26 20:39:23 1.12
+++ ab_apr.c 1999/06/16 11:16:04 1.13
@@ -228,7 +228,7 @@
}
c->state = STATE_READ;
- ap_add_poll_socket(readbits, c->aprsock, APR_POLLIN, c->socknum);
+ ap_add_poll_socket(readbits, c->aprsock, APR_POLLIN);
}
/* --------------------------------------------------------- */
@@ -464,7 +464,7 @@
if (ap_connect(c->aprsock, hostname) != APR_SUCCESS) {
if (errno == EINPROGRESS) {
c->state = STATE_CONNECTING;
- ap_add_poll_socket(readbits, c->aprsock, APR_POLLOUT,
c->socknum);
+ ap_add_poll_socket(readbits, c->aprsock, APR_POLLOUT);
return;
}
else {
@@ -759,7 +759,7 @@
err("select");
for (i = 0; i < concurrency; i++) {
- ap_get_revents(readbits, con[i].socknum, &rv);
+ ap_get_revents(readbits, con[i].aprsock, &rv);
if ((rv & APR_POLLERR) || (rv & APR_POLLNVAL) || (rv &
APR_POLLHUP)) {
bad++;
err_except++;
1.14 +0 -3 apache-apr/apr/test/testsock.c
Index: testsock.c
===================================================================
RCS file: /home/cvs/apache-apr/apr/test/testsock.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- testsock.c 1999/06/15 17:43:25 1.13
+++ testsock.c 1999/06/16 11:16:05 1.14
@@ -95,9 +95,6 @@
exit(-1);
}
- ap_setprocattr_detach(attr1, FALSE);
- ap_setprocattr_detach(attr2, FALSE);
-
args[0] = ap_pstrdup(context, "server");
args[1] = NULL;
s1 = ap_create_process(context, "./server", args, NULL, attr1, &proc1);