Index: content/browser/android/in_process/synchronous_compositor_factory_impl.cc |
diff --git a/content/browser/android/in_process/synchronous_compositor_factory_impl.cc b/content/browser/android/in_process/synchronous_compositor_factory_impl.cc |
index 62aa33e256462bc2c671714f1c9649b053edfb55..ba4b894de1747dcf81356362e1495f4acc190746 100644 |
--- a/content/browser/android/in_process/synchronous_compositor_factory_impl.cc |
+++ b/content/browser/android/in_process/synchronous_compositor_factory_impl.cc |
@@ -179,13 +179,27 @@ scoped_refptr<ContextProviderWebContext> SynchronousCompositorFactoryImpl:: |
scoped_refptr<cc::ContextProvider> SynchronousCompositorFactoryImpl:: |
CreateOnscreenContextProviderForCompositorThread( |
scoped_refptr<gfx::GLSurface> surface) { |
- DCHECK(surface); |
DCHECK(service_); |
- if (!share_context_.get()) |
- share_context_ = CreateContext(NULL, service_, NULL); |
+ |
+ // TODO(boliu): This sucks. Find a better way. |
+ gpu::GLInProcessContext* share_context = NULL; |
+ { |
+ base::AutoLock lock(num_hardware_compositor_lock_); |
+ share_context = share_context_.get(); |
+ } |
+ if (!share_context) { |
+ scoped_ptr<gpu::GLInProcessContext> context = CreateContext(NULL, service_, NULL); |
+ { |
+ base::AutoLock lock(num_hardware_compositor_lock_); |
+ if (!share_context_.get()) |
+ share_context_ = context.Pass(); |
+ share_context = share_context_.get(); |
+ } |
+ } |
+ |
return webkit::gpu::ContextProviderInProcess::Create( |
- WrapContext(CreateContext(surface, service_, share_context_.get())), |
+ WrapContext(CreateContext(surface, service_, share_context)), |
"Compositor-Onscreen"); |
} |