OSDN Git Service

b/3491968 stop the hanging of dunkindonuts.com
authorHuahui Wu <hwu@google.com>
Tue, 19 Apr 2011 15:58:00 +0000 (08:58 -0700)
committerHuahui Wu <hwu@google.com>
Tue, 19 Apr 2011 17:02:38 +0000 (10:02 -0700)
Same as https://android-git.corp.google.com/g/#change,105743 but in Master.
Changed the waiting to 10 seconds each attempt after asking around.

Sometimes, a sync load can wait forever and lock up the network thread,
here we replace Wait() with TimedWait() with multiple tries to avoid locking.
Unfortunately, TimedWait() doesn't return anything and can't tell if it's
a timeout or a quick pass, so we query timeofday and allow a few seconds for
the system timing error.

Change-Id: I391fb3f815413f17b2927c1e90cbddab7faed071

WebKit/android/WebCoreSupport/WebUrlLoaderClient.cpp

index fcfb4ca..cf218e7 100644 (file)
@@ -180,14 +180,29 @@ bool WebUrlLoaderClient::start(bool isMainResource, bool isMainFrame, bool sync,
         thread->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(m_request.get(), &WebRequest::start));
 
         // Run callbacks until the queue is exhausted and m_finished is true.
+        // Sometimes, a sync load can wait forever and lock up the WebCore thread,
+        // here we use TimedWait() with multiple tries to avoid locking.
+        const int kMaxNumTimeout = 3;
+        const int kCallbackWaitingTime = 10;
+        int num_timeout = 0;
         while(!m_finished) {
             while (!m_queue.empty()) {
                 OwnPtr<Task> task(m_queue.front());
                 m_queue.pop_front();
                 task->Run();
             }
-            if (m_queue.empty() && !m_finished) {
-                syncCondition()->Wait();
+            if (m_finished) break;
+
+            syncCondition()->TimedWait(base::TimeDelta::FromSeconds(kCallbackWaitingTime));
+            if (m_queue.empty()) {
+                LOGE("Synchronous request timed out after %d seconds for the %dth try, URL: %s",
+                     kCallbackWaitingTime, num_timeout, m_request->getUrl().c_str());
+                num_timeout++;
+                if (num_timeout >= kMaxNumTimeout) {
+                    cancel();
+                    m_resourceHandle = 0;
+                    return false;
+                }
             }
         }