From 95b69b8d54e54dd36ed9290190934af3e835e912 Mon Sep 17 00:00:00 2001 From: Huahui Wu Date: Tue, 19 Apr 2011 15:51:22 -0700 Subject: 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 --- WebKit/android/WebCoreSupport/WebUrlLoaderClient.cpp | 19 +++++++++++++++++-- 1 file 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(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; + } } } -- cgit v1.1