summaryrefslogtreecommitdiffstats
path: root/WebKit/android
diff options
context:
space:
mode:
authorHuahui Wu <hwu@google.com>2011-04-19 08:58:00 -0700
committerHuahui Wu <hwu@google.com>2011-04-19 10:02:38 -0700
commit1360c55ddd4e5ce56a558c055de5b09d250c51b4 (patch)
tree4678fcd7283c8f3ba9d75f228018934e5a5f501d /WebKit/android
parented1aaa7d1c69a85e4c93cec1dbe111554bb34642 (diff)
downloadexternal_webkit-1360c55ddd4e5ce56a558c055de5b09d250c51b4.zip
external_webkit-1360c55ddd4e5ce56a558c055de5b09d250c51b4.tar.gz
external_webkit-1360c55ddd4e5ce56a558c055de5b09d250c51b4.tar.bz2
b/3491968 stop the hanging of dunkindonuts.com
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
Diffstat (limited to 'WebKit/android')
-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;
+ }
}
}