summaryrefslogtreecommitdiffstats
path: root/media/base/pipeline.cc
diff options
context:
space:
mode:
authorscherkus <scherkus@chromium.org>2014-09-09 00:42:25 -0700
committerCommit bot <commit-bot@chromium.org>2014-09-09 07:48:49 +0000
commit0abb84994f293d6fc17e5c2d3e21a933d4f73fbc (patch)
tree39a5386bb805669f190b188aec09f91af7ea90d9 /media/base/pipeline.cc
parent01c8ca08dc8200c3c674726c1183916ebc7f2bab (diff)
downloadchromium_src-0abb84994f293d6fc17e5c2d3e21a933d4f73fbc.zip
chromium_src-0abb84994f293d6fc17e5c2d3e21a933d4f73fbc.tar.gz
chromium_src-0abb84994f293d6fc17e5c2d3e21a933d4f73fbc.tar.bz2
Fix potential deadlock between Pipeline and VideoRendererImpl.
I don't believe we hit this in practice since the two lock acquiring sequences we make happen as separate tasks executed on the same thread. To summarize the ThreadSanitizer warning: - Task A acquires VideoRendererImpl -> Pipeline lock via FrameReady() -> GetMediaDuration() - Task B acquires Pipeline -> VideoRendererImpl lock via DoStop() -> ~VideoRendererImpl() Solution: don't hold onto the Pipeline lock when destroying renderers. BUG=412097 Review URL: https://codereview.chromium.org/557603002 Cr-Commit-Position: refs/heads/master@{#293890}
Diffstat (limited to 'media/base/pipeline.cc')
-rw-r--r--media/base/pipeline.cc6
1 files changed, 5 insertions, 1 deletions
diff --git a/media/base/pipeline.cc b/media/base/pipeline.cc
index 42a796f..6e680d5 100644
--- a/media/base/pipeline.cc
+++ b/media/base/pipeline.cc
@@ -405,10 +405,14 @@ void Pipeline::DoStop(const PipelineStatusCB& done_cb) {
DCHECK(task_runner_->BelongsToCurrentThread());
DCHECK(!pending_callbacks_.get());
+ // TODO(scherkus): Enforce that Renderer is only called on a single thread,
+ // even for accessing media time http://crbug.com/370634
+ scoped_ptr<Renderer> renderer;
{
base::AutoLock auto_lock(lock_);
- renderer_.reset();
+ renderer.swap(renderer_);
}
+ renderer.reset();
text_renderer_.reset();
if (demuxer_) {