From dae43b16a79a27067f032c69569868af88294220 Mon Sep 17 00:00:00 2001 From: Yuya Aoki Date: Thu, 14 Mar 2013 18:02:22 +0900 Subject: Fix deadlock of WebViewCoreThread There was a deadlock in destroy process. Investigation showed that WebViewCoreThread is waiting some callbacks but in this case WebViewCoreThread can not resume itself not to call notify method. Flow: 1. CallbackProxy.sendMessageToUiThreadSync 2. WebViewClassic.destroy() 3. CallbackProxy.blockMessages() 4. CallbackProxy.handleMessage is called via MainThread 5. The WebViewCoreThread deadlock is occured. The cases we have to call notify method are followings. OVERRIDE_URL CREATE_WINDOW SAVE_PASSWORD NOTIFY OPEN_FILE_CHOOSER JS_ALERT JS_CONFIRM JS_PROMPT JS_UNLOAD JS_TIMEOUT Change-Id: I9d95ae500bf6338d77b32b5fa15de7cff5720d0f --- core/java/android/webkit/CallbackProxy.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'core/java/android/webkit') diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java index a326da2..c3c5103 100644 --- a/core/java/android/webkit/CallbackProxy.java +++ b/core/java/android/webkit/CallbackProxy.java @@ -305,7 +305,12 @@ class CallbackProxy extends Handler { // in the UI thread. The WebViewClient and WebChromeClient functions // that check for a non-null callback are ok because java ensures atomic // 32-bit reads and writes. - if (messagesBlocked()) return; + if (messagesBlocked()) { + synchronized (this) { + notify(); + } + return; + } switch (msg.what) { case PAGE_STARTED: String startedUrl = msg.getData().getString("url"); -- cgit v1.1