summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHuahui Wu <hwu@google.com>2011-04-19 15:51:22 -0700
committerHuahui Wu <hwu@google.com>2011-04-19 15:51:22 -0700
commit95b69b8d54e54dd36ed9290190934af3e835e912 (patch)
tree71e51931805f1b546f0453283cb3de0b75cc0502
parent1deed5ff76dad5d0783c0e07639338f1d6b08a67 (diff)
downloadexternal_webkit-95b69b8d54e54dd36ed9290190934af3e835e912.zip
external_webkit-95b69b8d54e54dd36ed9290190934af3e835e912.tar.gz
external_webkit-95b69b8d54e54dd36ed9290190934af3e835e912.tar.bz2
DO NOT MERGE
cherry pick of https://android-git.corp.google.com/g/#change,106682 b/3491968 stop the hanging of dunkindonuts.com 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: I991617130f93b44518d28926725f261d4569d73c
-rw-r--r--WebKit/android/WebCoreSupport/WebUrlLoaderClient.cpp19
1 files changed, 17 insertions, 2 deletions
diff --git a/WebKit/android/WebCoreSupport/WebUrlLoaderClient.cpp b/WebKit/android/WebCoreSupport/WebUrlLoaderClient.cpp
index fcfb4ca..cf218e7 100644
--- a/WebKit/android/WebCoreSupport/WebUrlLoaderClient.cpp
+++ b/WebKit/android/WebCoreSupport/WebUrlLoaderClient.cpp
@@ -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;
+ }
}
}