2007-12-18 Rodney Dawes <dobey@wayofthemonkey.com>
authoralp@webkit.org <alp@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 18 Dec 2007 21:36:31 +0000 (21:36 +0000)
committeralp@webkit.org <alp@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 18 Dec 2007 21:36:31 +0000 (21:36 +0000)
        Reviewed by Darin Adler.

        Handle EINTR when set by select() and try the select() again
        http://bugs.webkit.org/show_bug.cgi?id=16071

        * platform/network/curl/ResourceHandleManager.cpp:
        (ResourceHandleManager::downloadTimerCallback):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@28834 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/platform/network/curl/ResourceHandleManager.cpp

index 166d7afb15dd1fbc255ccfcc2a043eae67a560b2..46e413814e7b51eddb3aa01e54b7d5b6b49ec070 100644 (file)
@@ -1,3 +1,13 @@
+2007-12-18  Rodney Dawes  <dobey@wayofthemonkey.com>
+
+        Reviewed by Darin Adler.
+
+        Handle EINTR when set by select() and try the select() again
+        http://bugs.webkit.org/show_bug.cgi?id=16071
+
+        * platform/network/curl/ResourceHandleManager.cpp:
+        (ResourceHandleManager::downloadTimerCallback):
+
 2007-12-18  Dan Bernstein  <mitz@apple.com>
 
         Reviewed by Dave Hyatt.
index c402bd2d7df5ef158b271e2846a4cd7b37f97213..4bbfd94757e29089a50ad202d89d183caea825eb 100644 (file)
@@ -38,6 +38,7 @@
 #include "HTTPParsers.h"
 #include "Base64.h"
 
+#include <errno.h>
 #include <wtf/Vector.h>
 
 namespace WebCore {
@@ -195,13 +196,9 @@ void ResourceHandleManager::downloadTimerCallback(Timer<ResourceHandleManager>*
     startScheduledJobs();
 
     fd_set fdread;
-    FD_ZERO(&fdread);
     fd_set fdwrite;
-    FD_ZERO(&fdwrite);
     fd_set fdexcep;
-    FD_ZERO(&fdexcep);
     int maxfd = 0;
-    curl_multi_fdset(m_curlMultiHandle, &fdread, &fdwrite, &fdexcep, &maxfd);
 
     struct timeval timeout;
     timeout.tv_sec = 0;
@@ -209,12 +206,19 @@ void ResourceHandleManager::downloadTimerCallback(Timer<ResourceHandleManager>*
 
     // Temporarily disable timers since signals may interrupt select(), raising EINTR errors on some platforms
     setDeferringTimers(true);
-    int rc = ::select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
+    int rc;
+    do {
+        FD_ZERO(&fdread);
+        FD_ZERO(&fdwrite);
+        FD_ZERO(&fdexcep);
+        curl_multi_fdset(m_curlMultiHandle, &fdread, &fdwrite, &fdexcep, &maxfd);
+        rc = ::select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
+    } while (rc == -1 && errno == EINTR);
     setDeferringTimers(false);
 
     if (-1 == rc) {
 #ifndef NDEBUG
-        printf("bad: select() returned -1\n");
+        perror("bad: select() returned -1: ");
 #endif
         return;
     }