Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Side by Side Diff: android_webview/browser/shared_renderer_state.cc

Issue 1844343005: WIP - Control the lifetime of RenderThreadManager from Java. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "android_webview/browser/shared_renderer_state.h" 5 #include "android_webview/browser/shared_renderer_state.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "android_webview/browser/child_frame.h" 9 #include "android_webview/browser/child_frame.h"
10 #include "android_webview/browser/deferred_gpu_command_service.h" 10 #include "android_webview/browser/deferred_gpu_command_service.h"
11 #include "android_webview/browser/hardware_renderer.h" 11 #include "android_webview/browser/hardware_renderer.h"
12 #include "android_webview/browser/scoped_app_gl_state_restore.h" 12 #include "android_webview/browser/scoped_app_gl_state_restore.h"
13 #include "android_webview/browser/shared_renderer_state_client.h" 13 #include "android_webview/browser/shared_renderer_state_client.h"
14 #include "android_webview/jni/SharedRendererState_jni.h"
14 #include "android_webview/public/browser/draw_gl.h" 15 #include "android_webview/public/browser/draw_gl.h"
15 #include "base/bind.h" 16 #include "base/bind.h"
16 #include "base/lazy_instance.h" 17 #include "base/lazy_instance.h"
17 #include "base/location.h" 18 #include "base/location.h"
18 #include "base/time/time.h" 19 #include "base/time/time.h"
19 #include "base/trace_event/trace_event_argument.h" 20 #include "base/trace_event/trace_event_argument.h"
21 #include "content/public/browser/browser_thread.h"
20 22
21 namespace android_webview { 23 namespace android_webview {
22 24
23 namespace internal { 25 namespace internal {
24 26
25 class RequestDrawGLTracker { 27 class RequestDrawGLTracker {
26 public: 28 public:
27 RequestDrawGLTracker(); 29 RequestDrawGLTracker();
28 bool ShouldRequestOnNonUiThread(SharedRendererState* state); 30 bool ShouldRequestOnNonUiThread(SharedRendererState* state);
29 bool ShouldRequestOnUiThread(SharedRendererState* state); 31 bool ShouldRequestOnUiThread(SharedRendererState* state);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 } // namespace internal 82 } // namespace internal
81 83
82 namespace { 84 namespace {
83 85
84 base::LazyInstance<internal::RequestDrawGLTracker> g_request_draw_gl_tracker = 86 base::LazyInstance<internal::RequestDrawGLTracker> g_request_draw_gl_tracker =
85 LAZY_INSTANCE_INITIALIZER; 87 LAZY_INSTANCE_INITIALIZER;
86 88
87 } 89 }
88 90
89 SharedRendererState::SharedRendererState( 91 SharedRendererState::SharedRendererState(
90 SharedRendererStateClient* client,
91 const scoped_refptr<base::SingleThreadTaskRunner>& ui_loop) 92 const scoped_refptr<base::SingleThreadTaskRunner>& ui_loop)
92 : ui_loop_(ui_loop), 93 : ui_loop_(ui_loop),
93 client_(client), 94 client_(nullptr),
94 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()), 95 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()),
95 hardware_renderer_has_frame_(false), 96 hardware_renderer_has_frame_(false),
96 inside_hardware_release_(false), 97 inside_hardware_release_(false),
97 weak_factory_on_ui_thread_(this) { 98 weak_factory_on_ui_thread_(this) {
98 DCHECK(ui_loop_->BelongsToCurrentThread()); 99 DCHECK(ui_loop_->BelongsToCurrentThread());
99 DCHECK(client_);
100 ui_thread_weak_ptr_ = weak_factory_on_ui_thread_.GetWeakPtr(); 100 ui_thread_weak_ptr_ = weak_factory_on_ui_thread_.GetWeakPtr();
101 ResetRequestDrawGLCallback(); 101 }
102
103 void SharedRendererState::SetClient(SharedRendererStateClient* client) {
104 DCHECK((!client_ && client) || (client_ && !client));
105 if (client_) {
106 request_draw_gl_cancelable_closure_.Cancel();
107 }
108 client_ = client;
109 if (client_) {
110 ResetRequestDrawGLCallback();
111 }
102 } 112 }
103 113
104 SharedRendererState::~SharedRendererState() { 114 SharedRendererState::~SharedRendererState() {
105 DCHECK(ui_loop_->BelongsToCurrentThread()); 115 DCHECK(ui_loop_->BelongsToCurrentThread());
106 DCHECK(!hardware_renderer_.get()); 116 DCHECK(!hardware_renderer_.get());
107 } 117 }
108 118
109 void SharedRendererState::ClientRequestDrawGL(bool for_idle) { 119 void SharedRendererState::ClientRequestDrawGL(bool for_idle) {
110 if (ui_loop_->BelongsToCurrentThread()) { 120 if (ui_loop_->BelongsToCurrentThread()) {
111 if (!g_request_draw_gl_tracker.Get().ShouldRequestOnUiThread(this)) 121 if (!g_request_draw_gl_tracker.Get().ShouldRequestOnUiThread(this))
(...skipping 22 matching lines...) Expand all
134 144
135 void SharedRendererState::ResetRequestDrawGLCallback() { 145 void SharedRendererState::ResetRequestDrawGLCallback() {
136 DCHECK(ui_loop_->BelongsToCurrentThread()); 146 DCHECK(ui_loop_->BelongsToCurrentThread());
137 base::AutoLock lock(lock_); 147 base::AutoLock lock(lock_);
138 request_draw_gl_cancelable_closure_.Reset(base::Bind( 148 request_draw_gl_cancelable_closure_.Reset(base::Bind(
139 &SharedRendererState::ClientRequestDrawGLOnUI, base::Unretained(this))); 149 &SharedRendererState::ClientRequestDrawGLOnUI, base::Unretained(this)));
140 request_draw_gl_closure_ = request_draw_gl_cancelable_closure_.callback(); 150 request_draw_gl_closure_ = request_draw_gl_cancelable_closure_.callback();
141 } 151 }
142 152
143 void SharedRendererState::ClientRequestDrawGLOnUI() { 153 void SharedRendererState::ClientRequestDrawGLOnUI() {
154 DCHECK(client_);
boliu 2016/04/01 03:13:39 How can you enforce this? This is not called by th
144 DCHECK(ui_loop_->BelongsToCurrentThread()); 155 DCHECK(ui_loop_->BelongsToCurrentThread());
145 ResetRequestDrawGLCallback(); 156 ResetRequestDrawGLCallback();
146 g_request_draw_gl_tracker.Get().SetQueuedFunctorOnUi(this); 157 g_request_draw_gl_tracker.Get().SetQueuedFunctorOnUi(this);
147 if (!client_->RequestDrawGL(false)) { 158 if (!client_->RequestDrawGL(false)) {
148 g_request_draw_gl_tracker.Get().ResetPending(); 159 g_request_draw_gl_tracker.Get().ResetPending();
149 LOG(ERROR) << "Failed to request GL process. Deadlock likely"; 160 LOG(ERROR) << "Failed to request GL process. Deadlock likely";
150 } 161 }
151 } 162 }
152 163
153 void SharedRendererState::UpdateParentDrawConstraintsOnUI() { 164 void SharedRendererState::UpdateParentDrawConstraintsOnUI() {
165 DCHECK(client_);
154 DCHECK(ui_loop_->BelongsToCurrentThread()); 166 DCHECK(ui_loop_->BelongsToCurrentThread());
155 client_->OnParentDrawConstraintsUpdated(); 167 client_->OnParentDrawConstraintsUpdated();
156 } 168 }
157 169
158 void SharedRendererState::SetScrollOffsetOnUI(gfx::Vector2d scroll_offset) { 170 void SharedRendererState::SetScrollOffsetOnUI(gfx::Vector2d scroll_offset) {
159 base::AutoLock lock(lock_); 171 base::AutoLock lock(lock_);
160 scroll_offset_ = scroll_offset; 172 scroll_offset_ = scroll_offset;
161 } 173 }
162 174
163 gfx::Vector2d SharedRendererState::GetScrollOffsetOnRT() { 175 gfx::Vector2d SharedRendererState::GetScrollOffsetOnRT() {
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 DeferredGpuCommandService::GetInstance()->PerformIdleWork(true); 320 DeferredGpuCommandService::GetInstance()->PerformIdleWork(true);
309 } 321 }
310 return; 322 return;
311 } 323 }
312 324
313 hardware_renderer_->DrawGL(draw_info, state_restore); 325 hardware_renderer_->DrawGL(draw_info, state_restore);
314 DeferredGpuCommandService::GetInstance()->PerformIdleWork(false); 326 DeferredGpuCommandService::GetInstance()->PerformIdleWork(false);
315 } 327 }
316 328
317 void SharedRendererState::DeleteHardwareRendererOnUI() { 329 void SharedRendererState::DeleteHardwareRendererOnUI() {
330 DCHECK(client_);
318 DCHECK(ui_loop_->BelongsToCurrentThread()); 331 DCHECK(ui_loop_->BelongsToCurrentThread());
319 332
320 InsideHardwareReleaseReset auto_inside_hardware_release_reset(this); 333 InsideHardwareReleaseReset auto_inside_hardware_release_reset(this);
321 334
322 client_->DetachFunctorFromView(); 335 client_->DetachFunctorFromView();
323 336
324 // If the WebView gets onTrimMemory >= MODERATE twice in a row, the 2nd 337 // If the WebView gets onTrimMemory >= MODERATE twice in a row, the 2nd
325 // onTrimMemory will result in an unnecessary Render Thread DrawGL call. 338 // onTrimMemory will result in an unnecessary Render Thread DrawGL call.
326 bool hardware_initialized = HasFrameOnUI(); 339 bool hardware_initialized = HasFrameOnUI();
327 if (hardware_initialized) { 340 if (hardware_initialized) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 SharedRendererState* shared_renderer_state) 383 SharedRendererState* shared_renderer_state)
371 : shared_renderer_state_(shared_renderer_state) { 384 : shared_renderer_state_(shared_renderer_state) {
372 DCHECK(!shared_renderer_state_->IsInsideHardwareRelease()); 385 DCHECK(!shared_renderer_state_->IsInsideHardwareRelease());
373 shared_renderer_state_->SetInsideHardwareRelease(true); 386 shared_renderer_state_->SetInsideHardwareRelease(true);
374 } 387 }
375 388
376 SharedRendererState::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() { 389 SharedRendererState::InsideHardwareReleaseReset::~InsideHardwareReleaseReset() {
377 shared_renderer_state_->SetInsideHardwareRelease(false); 390 shared_renderer_state_->SetInsideHardwareRelease(false);
378 } 391 }
379 392
393 static void Destroy(JNIEnv* env,
394 const JavaParamRef<jclass>&,
395 jlong shared_renderer_state) {
396 delete reinterpret_cast<SharedRendererState*>(shared_renderer_state);
397 }
398
399 bool RegisterSharedRendererState(JNIEnv* env) {
400 return RegisterNativesImpl(env);
401 }
402
380 } // namespace android_webview 403 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698