From ff4e970fb1c71c4998911c6185bfbfe92d4c9001 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Fri, 17 Sep 2004 14:36:55 +0000 Subject: Make new poll stuff work on win32 (and still be safe on unix) --- main/network.c | 25 +++++++------------------ main/streams/xp_socket.c | 3 +++ win32/build/config.w32 | 2 +- 3 files changed, 11 insertions(+), 19 deletions(-) diff --git a/main/network.c b/main/network.c index 86d71cd14d..d16f796832 100644 --- a/main/network.c +++ b/main/network.c @@ -1047,7 +1047,7 @@ PHPAPI int php_poll2(php_pollfd *ufds, unsigned int nfds, int timeout) php_socket_t max_fd = SOCK_ERR; unsigned int i, n; struct timeval tv; - + /* check the highest numbered descriptor */ for (i = 0; i < nfds; i++) { if (ufds[i].fd > max_fd) @@ -1061,19 +1061,14 @@ PHPAPI int php_poll2(php_pollfd *ufds, unsigned int nfds, int timeout) FD_ZERO(&eset); for (i = 0; i < nfds; i++) { - if (ufds[i].fd >= FD_SETSIZE) { - /* unsafe to set */ - ufds[i].revents = POLLNVAL; - continue; - } if (ufds[i].events & PHP_POLLREADABLE) { - FD_SET(ufds[i].fd, &rset); + PHP_SAFE_FD_SET(ufds[i].fd, &rset); } if (ufds[i].events & POLLOUT) { - FD_SET(ufds[i].fd, &wset); + PHP_SAFE_FD_SET(ufds[i].fd, &wset); } if (ufds[i].events & POLLPRI) { - FD_SET(ufds[i].fd, &eset); + PHP_SAFE_FD_SET(ufds[i].fd, &eset); } } @@ -1081,30 +1076,24 @@ PHPAPI int php_poll2(php_pollfd *ufds, unsigned int nfds, int timeout) tv.tv_sec = timeout / 1000; tv.tv_usec = (timeout - (tv.tv_sec * 1000)) * 1000; } - n = select(max_fd + 1, &rset, &wset, &eset, timeout >= 0 ? &tv : NULL); if (n >= 0) { for (i = 0; i < nfds; i++) { - if (ufds[i].fd >= FD_SETSIZE) { - continue; - } - ufds[i].revents = 0; - if (FD_ISSET(ufds[i].fd, &rset)) { + if (PHP_SAFE_FD_ISSET(ufds[i].fd, &rset)) { /* could be POLLERR or POLLHUP but can't tell without probing */ ufds[i].revents |= POLLIN; } - if (FD_ISSET(ufds[i].fd, &wset)) { + if (PHP_SAFE_FD_ISSET(ufds[i].fd, &wset)) { ufds[i].revents |= POLLOUT; } - if (FD_ISSET(ufds[i].fd, &eset)) { + if (PHP_SAFE_FD_ISSET(ufds[i].fd, &eset)) { ufds[i].revents |= POLLPRI; } } } - return n; } diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c index 746a9348c4..f67161698c 100644 --- a/main/streams/xp_socket.c +++ b/main/streams/xp_socket.c @@ -127,6 +127,9 @@ static void php_sock_stream_wait_for_data(php_stream *stream, php_netstream_data if (retval >= 0) break; + + if (php_socket_errno() != EINTR) + break; } } diff --git a/win32/build/config.w32 b/win32/build/config.w32 index 1bb0d0e9e6..38cd72de96 100644 --- a/win32/build/config.w32 +++ b/win32/build/config.w32 @@ -218,7 +218,7 @@ AC_DEFINE('HAVE_IPV6', main_network_has_ipv6); /* this allows up to 256 sockets to be select()ed in a single * call to select(), instead of the usual 64 */ ARG_ENABLE('fd-setsize', "Set maximum number of sockets for select(2)", "256"); -AC_DEFINE('FD_SETSIZE', PHP_FD_SETSIZE); +ADD_FLAG("CFLAGS", "/D FD_SETSIZE=" + parseInt(PHP_FD_SETSIZE)); ARG_ENABLE("memory-limit", "Enable memory limit checking code", "no"); -- cgit v1.2.1