summaryrefslogtreecommitdiff
path: root/android_webview/browser/shared_renderer_state.cc
diff options
context:
space:
mode:
Diffstat (limited to 'android_webview/browser/shared_renderer_state.cc')
-rw-r--r--android_webview/browser/shared_renderer_state.cc14
1 files changed, 13 insertions, 1 deletions
diff --git a/android_webview/browser/shared_renderer_state.cc b/android_webview/browser/shared_renderer_state.cc
index 0de8371b1c..b880ce00ad 100644
--- a/android_webview/browser/shared_renderer_state.cc
+++ b/android_webview/browser/shared_renderer_state.cc
@@ -18,8 +18,8 @@ class RequestDrawGLTracker {
RequestDrawGLTracker();
bool ShouldRequestOnNoneUiThread(SharedRendererState* state);
bool ShouldRequestOnUiThread(SharedRendererState* state);
- void DidRequestOnUiThread();
void ResetPending();
+ void SetQueuedFunctorOnUi(SharedRendererState* state);
private:
base::Lock lock_;
@@ -46,6 +46,9 @@ bool RequestDrawGLTracker::ShouldRequestOnUiThread(SharedRendererState* state) {
pending_non_ui_->ResetRequestDrawGLCallback();
pending_non_ui_ = NULL;
}
+ // At this time, we could have already called RequestDrawGL on the UI thread,
+ // but the corresponding GL mode process hasn't happened yet. In this case,
+ // don't schedule another requestDrawGL on the UI thread.
if (pending_ui_)
return false;
pending_ui_ = state;
@@ -58,6 +61,14 @@ void RequestDrawGLTracker::ResetPending() {
pending_ui_ = NULL;
}
+void RequestDrawGLTracker::SetQueuedFunctorOnUi(SharedRendererState* state) {
+ base::AutoLock lock(lock_);
+ DCHECK(state);
+ DCHECK(pending_ui_ == state || pending_non_ui_ == state);
+ pending_ui_ = state;
+ pending_non_ui_ = NULL;
+}
+
} // namespace internal
namespace {
@@ -119,6 +130,7 @@ void SharedRendererState::ResetRequestDrawGLCallback() {
void SharedRendererState::ClientRequestDrawGLOnUIThread() {
DCHECK(ui_loop_->BelongsToCurrentThread());
ResetRequestDrawGLCallback();
+ g_request_draw_gl_tracker.Get().SetQueuedFunctorOnUi(this);
if (!client_on_ui_->RequestDrawGL(NULL, false)) {
g_request_draw_gl_tracker.Get().ResetPending();
LOG(ERROR) << "Failed to request GL process. Deadlock likely";