Bug 1299515 - Remove ReleaseMediaOperationResource. r?jib draft
authorAndreas Pehrson <pehrsons@mozilla.com>
Tue, 14 Nov 2017 11:53:52 +0100
changeset 748933 22e12a458cc715908cf336c7ae8e9983de460080
parent 748932 579bb4d3d316ea7311504d3b277056098bae17c2
child 748934 1b7c4ae3c7629fbeefc50340e1f43f36fcfb40ad
push id97281
push userbmo:apehrson@mozilla.com
push dateTue, 30 Jan 2018 18:29:03 +0000
reviewersjib
bugs1299515
milestone60.0a1
Bug 1299515 - Remove ReleaseMediaOperationResource. r?jib MozReview-Commit-ID: 184hG8rMCmc
dom/media/MediaManager.cpp
dom/media/MediaManager.h
--- a/dom/media/MediaManager.cpp
+++ b/dom/media/MediaManager.cpp
@@ -1056,29 +1056,30 @@ public:
     }
 
     MediaStreamGraph::GraphDriverType graphDriverType =
       mAudioDevice ? MediaStreamGraph::AUDIO_THREAD_DRIVER
                    : MediaStreamGraph::SYSTEM_THREAD_DRIVER;
     MediaStreamGraph* msg =
       MediaStreamGraph::GetInstance(graphDriverType, window);
 
-    RefPtr<DOMMediaStream> domStream;
+    nsMainThreadPtrHandle<DOMMediaStream> domStream;
     RefPtr<SourceMediaStream> stream;
     // AudioCapture is a special case, here, in the sense that we're not really
     // using the audio source and the SourceMediaStream, which acts as
     // placeholders. We re-route a number of stream internaly in the MSG and mix
     // them down instead.
     if (mAudioDevice &&
         mAudioDevice->GetMediaSource() == MediaSourceEnum::AudioCapture) {
       // It should be possible to pipe the capture stream to anything. CORS is
       // not a problem here, we got explicit user content.
       nsCOMPtr<nsIPrincipal> principal = window->GetExtantDoc()->NodePrincipal();
-      domStream =
-        DOMMediaStream::CreateAudioCaptureStreamAsInput(window, principal, msg);
+      domStream = new nsMainThreadPtrHolder<DOMMediaStream>(
+        "GetUserMediaStreamRunnable::AudioCaptureDOMStreamMainThreadHolder",
+        DOMMediaStream::CreateAudioCaptureStreamAsInput(window, principal, msg));
 
       stream = msg->CreateSourceStream(); // Placeholder
       msg->RegisterCaptureStreamForWindow(
             mWindowID, domStream->GetInputStream()->AsProcessedStream());
       window->SetAudioCapture(true);
     } else {
       class LocalTrackSource : public MediaStreamTrackSource
       {
@@ -1163,19 +1164,20 @@ public:
         principal = NullPrincipal::CreateWithInheritedAttributes(window->GetExtantDoc()->NodePrincipal());
       } else {
         principal = window->GetExtantDoc()->NodePrincipal();
       }
 
       // Normal case, connect the source stream to the track union stream to
       // avoid us blocking. Pass a simple TrackSourceGetter for potential
       // fake tracks. Apart from them gUM never adds tracks dynamically.
-      domStream =
+      domStream = new nsMainThreadPtrHolder<DOMMediaStream>(
+        "GetUserMediaStreamRunnable::DOMMediaStreamMainThreadHolder",
         DOMLocalMediaStream::CreateSourceStreamAsInput(window, msg,
-                                                       new FakeTrackSourceGetter(principal));
+                                                       new FakeTrackSourceGetter(principal)));
       stream = domStream->GetInputStream()->AsSourceStream();
 
       if (mAudioDevice) {
         nsString audioDeviceName;
         mAudioDevice->GetName(audioDeviceName);
         const MediaSourceEnum source =
           mAudioDevice->GetSource()->GetMediaSource();
         RefPtr<MediaStreamTrackSource> audioSource =
@@ -1218,18 +1220,25 @@ public:
     }
 
     // Activate our source listener. We'll call Start() on the source when we
     // get a callback that the MediaStream has started consuming. The listener
     // is freed when the page is invalidated (on navigation or close).
     mWindowListener->Activate(mSourceListener, stream, mAudioDevice, mVideoDevice);
 
     // Note: includes JS callbacks; must be released on MainThread
-    auto callback = MakeRefPtr<Refcountable<UniquePtr<OnTracksAvailableCallback>>>(
-        new TracksAvailableCallback(mManager, mOnSuccess.forget(), mWindowID, domStream));
+    typedef Refcountable<UniquePtr<TracksAvailableCallback>> Callback;
+    nsMainThreadPtrHandle<Callback> callback(
+      new nsMainThreadPtrHolder<Callback>(
+        "GetUserMediaStreamRunnable::TracksAvailableCallbackMainThreadHolder",
+        MakeAndAddRef<Callback>(
+          new TracksAvailableCallback(mManager,
+                                      mOnSuccess.forget(),
+                                      mWindowID,
+                                      domStream))));
 
     // Dispatch to the media thread to ask it to start the sources,
     // because that can take a while.
     // Pass ownership of domStream through the lambda to the nested chrome
     // notification lambda to ensure it's kept alive until that lambda runs or is discarded.
     RefPtr<GetUserMediaStreamRunnable> self = this;
     MediaManager::PostTask(NewTaskFrom([self, domStream, callback]() mutable {
       MOZ_ASSERT(MediaManager::IsInMediaThread());
@@ -1259,20 +1268,16 @@ public:
         if (NS_FAILED(rv)) {
           nsString log;
           log.AssignASCII("Starting video failed");
           error = new MediaMgrError(NS_LITERAL_STRING("InternalError"), log);
         }
       }
 
       if (error) {
-        // The DOM stream and track callback must be released on main thread.
-        NS_DispatchToMainThread(do_AddRef(new ReleaseMediaOperationResource(
-          domStream.forget(), callback.forget())));
-
         // Dispatch the error callback on main thread.
         nsCOMPtr<nsIDOMGetUserMediaSuccessCallback> onSuccess;
         NS_DispatchToMainThread(do_AddRef(
           new ErrorCallbackRunnable<nsIDOMGetUserMediaSuccessCallback>(
             Move(onSuccess), Move(self->mOnFailure), *error, self->mWindowID)));
 
         // This should be empty now
         MOZ_ASSERT(!self->mOnFailure);
--- a/dom/media/MediaManager.h
+++ b/dom/media/MediaManager.h
@@ -122,40 +122,16 @@ class AudioDevice : public MediaDevice
 public:
   typedef MediaEngineAudioSource Source;
 
   explicit AudioDevice(Source* aSource);
   NS_IMETHOD GetType(nsAString& aType) override;
   Source* GetSource() override;
 };
 
-typedef enum {
-  MEDIA_STOP,
-  MEDIA_STOP_TRACK,
-  MEDIA_DIRECT_LISTENERS,
-} MediaOperation;
-
-class ReleaseMediaOperationResource : public Runnable
-{
-public:
-  ReleaseMediaOperationResource(
-    already_AddRefed<DOMMediaStream> aStream,
-    already_AddRefed<media::Refcountable<UniquePtr<OnTracksAvailableCallback>>>
-      aOnTracksAvailableCallback)
-    : Runnable("ReleaseMediaOperationResource")
-    , mStream(aStream)
-    , mOnTracksAvailableCallback(aOnTracksAvailableCallback)
-  {
-  }
-  NS_IMETHOD Run() override {return NS_OK;}
-private:
-  RefPtr<DOMMediaStream> mStream;
-  RefPtr<media::Refcountable<UniquePtr<OnTracksAvailableCallback>>> mOnTracksAvailableCallback;
-};
-
 typedef nsRefPtrHashtable<nsUint64HashKey, GetUserMediaWindowListener> WindowTable;
 
 // we could add MediaManager if needed
 typedef void (*WindowListenerCallback)(MediaManager *aThis,
                                        uint64_t aWindowID,
                                        GetUserMediaWindowListener *aListener,
                                        void *aData);