diff options
author | Dmitry Stogov <dmitry@php.net> | 2007-02-24 11:21:10 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2007-02-24 11:21:10 +0000 |
commit | 10ffce328593ddda1fb31482ec5d19ce6e02556d (patch) | |
tree | c8da28d141ff81830e8692fed5ef6c4d32bc20c4 /sapi/cgi/fastcgi.c | |
parent | 94c3896f73858edc3c3eb24f59093fb970f2c99b (diff) | |
download | php-git-10ffce328593ddda1fb31482ec5d19ce6e02556d.tar.gz |
Use poll() instead of select() if available
Diffstat (limited to 'sapi/cgi/fastcgi.c')
-rw-r--r-- | sapi/cgi/fastcgi.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/sapi/cgi/fastcgi.c b/sapi/cgi/fastcgi.c index 3ac12a2def..7bbabb1127 100644 --- a/sapi/cgi/fastcgi.c +++ b/sapi/cgi/fastcgi.c @@ -71,6 +71,13 @@ # include <netdb.h> # include <signal.h> +# if defined(HAVE_SYS_POLL_H) && defined(HAVE_POLL) +# include <sys/poll.h> +# endif +# if defined(HAVE_SYS_SELECT_H) +# include <sys/select.h> +# endif + #ifndef INADDR_NONE #define INADDR_NONE ((unsigned long) -1) #endif @@ -758,17 +765,35 @@ int fcgi_accept_request(fcgi_request *req) #else if (req->fd >= 0) { if (req->fd < FD_SETSIZE) { +#if defined(HAVE_SYS_POLL_H) && defined(HAVE_POLL) + struct pollfd fds; + int ret; + + fds.fd = req->fd; + fds.events = POLLIN; + fds.revents = 0; + do { + errno = 0; + ret = poll(&fds, 1, 5000); + } while (ret < 0 && errno == EINTR); + if (ret > 0 && (fds.revents & POLLIN)) { + break; + } +#else struct timeval tv = {5,0}; fd_set set; + int ret; FD_ZERO(&set); FD_SET(req->fd, &set); -try_again: - errno = 0; - if (select(req->fd + 1, &set, NULL, NULL, &tv) >= 0 && FD_ISSET(req->fd, &set)) { + do { + errno = 0; + ret = select(req->fd + 1, &set, NULL, NULL, &tv) >= 0; + } while (ret < 0 && errno == EINTR); + if (ret > 0 && FD_ISSET(req->fd, &set)) { break; } - if (errno == EINTR) goto try_again; +#endif fcgi_close(req, 1, 0); } else { fprintf(stderr, "Too many open file descriptors. FD_SETSIZE limit exceeded."); |