diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-14 21:37:57 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-14 21:37:57 +0000 |
commit | 433d45b19e0bdcf5babb7be6fb97899a2f1936e3 (patch) | |
tree | fb483ee54a3e0681ea070835a59c170fc8976170 /content | |
parent | 538334711d2b2651a4ce1fdd7fa78695921d1c84 (diff) | |
download | chromium_src-433d45b19e0bdcf5babb7be6fb97899a2f1936e3.zip chromium_src-433d45b19e0bdcf5babb7be6fb97899a2f1936e3.tar.gz chromium_src-433d45b19e0bdcf5babb7be6fb97899a2f1936e3.tar.bz2 |
Fix threading and teardown assumptions in content::MediaSourceDelegate.
The thread-safety DCHECK in SetDuration() was incorrect since ChunkDemuxer will always call SetDuration() on the same thread that appended data (i.e., the main thread).
MediaSourceDelegate also needs to unregister itself from RendererBrowserDemuxer before it starts demuxer teardown, otherwise we race unregistering against RenderViewImpl deleting RendererBrowserDemuxer.
BUG=290945
Review URL: https://chromiumcodereview.appspot.com/24149002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@223263 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r-- | content/renderer/media/android/media_source_delegate.cc | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/content/renderer/media/android/media_source_delegate.cc b/content/renderer/media/android/media_source_delegate.cc index b83a1a0..67fe5c4 100644 --- a/content/renderer/media/android/media_source_delegate.cc +++ b/content/renderer/media/android/media_source_delegate.cc @@ -84,16 +84,22 @@ MediaSourceDelegate::~MediaSourceDelegate() { DVLOG(1) << __FUNCTION__ << " : " << demuxer_client_id_; DCHECK(!chunk_demuxer_); DCHECK(!demuxer_); + DCHECK(!demuxer_client_); DCHECK(!audio_decrypting_demuxer_stream_); DCHECK(!video_decrypting_demuxer_stream_); DCHECK(!audio_stream_); DCHECK(!video_stream_); - demuxer_client_->RemoveDelegate(demuxer_client_id_); } void MediaSourceDelegate::Destroy() { DCHECK(main_loop_->BelongsToCurrentThread()); DVLOG(1) << __FUNCTION__ << " : " << demuxer_client_id_; + + // |this| may live longer than |demuxer_client_| since this object deletes + // itself only after the demuxer has stopped. + demuxer_client_->RemoveDelegate(demuxer_client_id_); + demuxer_client_ = NULL; + if (!demuxer_) { delete this; return; @@ -103,7 +109,6 @@ void MediaSourceDelegate::Destroy() { time_update_seek_hack_cb_.Reset(); update_network_state_cb_.Reset(); media_source_opened_cb_.Reset(); - demuxer_client_ = NULL; main_weak_factory_.InvalidateWeakPtrs(); DCHECK(!main_weak_factory_.HasWeakPtrs()); @@ -278,9 +283,12 @@ void MediaSourceDelegate::AddBufferedTimeRange(base::TimeDelta start, } void MediaSourceDelegate::SetDuration(base::TimeDelta duration) { - DCHECK(media_loop_->BelongsToCurrentThread()); + DCHECK(main_loop_->BelongsToCurrentThread()); DVLOG(1) << __FUNCTION__ << "(" << duration.InSecondsF() << ") : " << demuxer_client_id_; + + // Force duration change notification to be async to avoid reentrancy into + // ChunkDemxuer. main_loop_->PostTask(FROM_HERE, base::Bind( &MediaSourceDelegate::OnDurationChanged, main_weak_this_, duration)); } |