Bug 1319987: P6. Shutdown demuxer asynchronously. r?gerald draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Thu, 26 Jan 2017 18:17:15 +0100
changeset 479123 93a6f7f700c5a83d086e08904aaaa5144e038ab5
parent 479122 08e827f7360d71c14c21163e1e82b2920c63ec6a
child 479124 2d4d6cc26d0e744f9b586e066883238ee4cfa50b
push id44146
push userbmo:jyavenard@mozilla.com
push dateSun, 05 Feb 2017 21:13:07 +0000
reviewersgerald
bugs1319987
milestone54.0a1
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
dom/media/MediaFormatReader.cpp
--- 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;