]> granicus.if.org Git - php/commitdiff
Use poll() instead of select() if available
authorDmitry Stogov <dmitry@php.net>
Sat, 24 Feb 2007 11:21:10 +0000 (11:21 +0000)
committerDmitry Stogov <dmitry@php.net>
Sat, 24 Feb 2007 11:21:10 +0000 (11:21 +0000)
sapi/cgi/fastcgi.c

index 3ac12a2def79cf4bc9ef7f6fee33b9414b6924d6..7bbabb11273b6e7e0322344d366e11ff19194698 100644 (file)
 # 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.");