diff options
author | sievers@chromium.org <sievers@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-20 02:00:46 +0000 |
---|---|---|
committer | sievers@chromium.org <sievers@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-20 02:00:46 +0000 |
commit | 8c66d2b08876fecef826393836d5e69b2bed9211 (patch) | |
tree | 98e65fc8c5768de7e2b254a7138c4665a13d5798 /content/renderer/gpu | |
parent | 0827a444ff0040e844e3841f717761517e47f77f (diff) | |
download | chromium_src-8c66d2b08876fecef826393836d5e69b2bed9211.zip chromium_src-8c66d2b08876fecef826393836d5e69b2bed9211.tar.gz chromium_src-8c66d2b08876fecef826393836d5e69b2bed9211.tar.bz2 |
Fix a potential race in OnSwapBuffersComplete().
It seems to be possible that we delete (and recreate) the graphics
context from
WebGraphicsContext3DCommandBufferImpl::OnSwapBuffersComplete() calling
renderview->OnViewContextSwapBuffersComplete().
This seems to be possible if the updated state already contains
a cmdbuffer error while the context did not receive OnContextLost yet.
BUG=110115
Review URL: https://chromiumcodereview.appspot.com/9159026
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@118392 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/renderer/gpu')
-rw-r--r-- | content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.cc | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.cc b/content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.cc index 5611945..2f3b51f 100644 --- a/content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.cc +++ b/content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.cc @@ -21,6 +21,7 @@ #include "base/command_line.h" #include "base/debug/trace_event.h" #include "base/logging.h" +#include "base/message_loop.h" #include "base/metrics/histogram.h" #include "base/synchronization/lock.h" #include "content/common/child_process.h" @@ -1134,8 +1135,12 @@ void WebGraphicsContext3DCommandBufferImpl::OnSwapBuffersComplete() { // This may be called after tear-down of the RenderView. RenderViewImpl* renderview = web_view_ ? RenderViewImpl::FromWebView(web_view_) : NULL; - if (renderview) - renderview->OnViewContextSwapBuffersComplete(); + if (renderview) { + MessageLoop::current()->PostTask( + FROM_HERE, + base::Bind(&RenderViewImpl::OnViewContextSwapBuffersComplete, + renderview)); + } if (swapbuffers_complete_callback_) swapbuffers_complete_callback_->onSwapBuffersComplete(); |