summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-14 21:37:57 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-14 21:37:57 +0000
commit433d45b19e0bdcf5babb7be6fb97899a2f1936e3 (patch)
treefb483ee54a3e0681ea070835a59c170fc8976170 /content
parent538334711d2b2651a4ce1fdd7fa78695921d1c84 (diff)
downloadchromium_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.cc14
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));
}