Bug 1319987: P6. Shutdown demuxer asynchronously. r?gerald
This prevents the demuxer attempting to use the parent resources once the parent has been shutdown.
MozReview-Commit-ID: LQqPxBkAfAS
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -478,25 +478,31 @@ public:
, mData(new Data(aDemuxer))
{
MOZ_COUNT_CTOR(DemuxerProxy);
}
~DemuxerProxy()
{
MOZ_COUNT_DTOR(DemuxerProxy);
+ }
+
+ RefPtr<ShutdownPromise> Shutdown()
+ {
mData->mAudioDemuxer = nullptr;
mData->mVideoDemuxer = nullptr;
RefPtr<Data> data = mData.forget();
- mTaskQueue->Dispatch(
+ return InvokeAsync(mTaskQueue, __func__, [data]() {
// We need to clear our reference to the demuxer now. So that in the event
// the init promise wasn't resolved, such as what can happen with the
// mediasource demuxer that is waiting on more data, it will force the
// init promise to be rejected.
- NS_NewRunnableFunction([data]() { data->mDemuxer = nullptr; }));
+ data->mDemuxer = nullptr;
+ return ShutdownPromise::CreateAndResolve(true, __func__);
+ });
}
RefPtr<MediaDataDemuxer::InitPromise> Init();
Wrapper*
GetTrackDemuxer(TrackType aTrack, uint32_t aTrackNumber)
{
MOZ_RELEASE_ASSERT(mData && mData->mInitDone);
@@ -880,23 +886,20 @@ MediaFormatReader::Shutdown()
if (HasVideo()) {
mVideo.ResetDemuxer();
mVideo.mTrackDemuxer->BreakCycles();
mVideo.mTrackDemuxer = nullptr;
mVideo.ResetState();
promises.AppendElement(ShutdownDecoderWithPromise(TrackInfo::kVideoTrack));
}
+ promises.AppendElement(mDemuxer->Shutdown());
mDemuxer = nullptr;
- mCompositorUpdatedListener.DisconnectIfExists();
- if (promises.IsEmpty()) {
- TearDownDecoders();
- return MediaDecoderReader::Shutdown();
- }
+ mCompositorUpdatedListener.DisconnectIfExists();
RefPtr<ShutdownPromise> p = mShutdownPromise.Ensure(__func__);
ShutdownPromise::All(OwnerThread(), promises)
->Then(OwnerThread(), __func__, this,
&MediaFormatReader::TearDownDecoders,
&MediaFormatReader::TearDownDecoders);
mShutdown = true;