Bug 1295352 - Release MediaEngineTabVideoSource main-thread-only members on main thread. r?jesup draft
authorAndreas Pehrson <pehrsons@gmail.com>
Tue, 30 Aug 2016 14:17:59 +0200
changeset 407392 1f8498fc5d2a81db2f663ece4586279b58770797
parent 407391 fd3a8cdfb95dd926d8f74424728714809704fd39
child 407393 c4f804afb9189984d719505c600f14f717b31f71
push id27960
push userpehrsons@gmail.com
push dateTue, 30 Aug 2016 12:30:56 +0000
reviewersjesup
bugs1295352
milestone51.0a1
Bug 1295352 - Release MediaEngineTabVideoSource main-thread-only members on main thread. r?jesup MozReview-Commit-ID: H3N70b9tGiI
dom/media/webrtc/MediaEngineTabVideoSource.cpp
dom/media/webrtc/MediaEngineTabVideoSource.h
--- a/dom/media/webrtc/MediaEngineTabVideoSource.cpp
+++ b/dom/media/webrtc/MediaEngineTabVideoSource.cpp
@@ -114,16 +114,27 @@ MediaEngineTabVideoSource::InitRunnable:
     mVideoSource->mWindow = nsPIDOMWindowOuter::From(win);
     MOZ_ASSERT(mVideoSource->mWindow);
   }
   nsCOMPtr<nsIRunnable> start(new StartRunnable(mVideoSource));
   start->Run();
   return NS_OK;
 }
 
+nsresult
+MediaEngineTabVideoSource::DestroyRunnable::Run()
+{
+  MOZ_ASSERT(NS_IsMainThread());
+
+  mVideoSource->mWindow = nullptr;
+  mVideoSource->mTabSource = nullptr;
+
+  return NS_OK;
+}
+
 void
 MediaEngineTabVideoSource::GetName(nsAString_internal& aName) const
 {
   aName.AssignLiteral(u"&getUserMedia.videoSource.tabShare;");
 }
 
 void
 MediaEngineTabVideoSource::GetUUID(nsACString_internal& aUuid) const
@@ -188,16 +199,18 @@ MediaEngineTabVideoSource::Restart(Alloc
   }
   return NS_OK;
 }
 
 nsresult
 MediaEngineTabVideoSource::Deallocate(AllocationHandle* aHandle)
 {
   MOZ_ASSERT(!aHandle);
+  NS_DispatchToMainThread(do_AddRef(new DestroyRunnable(this)));
+
   {
     MonitorAutoLock mon(mMonitor);
     mState = kReleased;
   }
   return NS_OK;
 }
 
 nsresult
--- a/dom/media/webrtc/MediaEngineTabVideoSource.h
+++ b/dom/media/webrtc/MediaEngineTabVideoSource.h
@@ -71,16 +71,23 @@ class MediaEngineTabVideoSource : public
 
     class InitRunnable : public Runnable {
     public:
       explicit InitRunnable(MediaEngineTabVideoSource *videoSource) : mVideoSource(videoSource) {}
       NS_IMETHOD Run();
       RefPtr<MediaEngineTabVideoSource> mVideoSource;
     };
 
+    class DestroyRunnable : public Runnable {
+    public:
+      explicit DestroyRunnable(MediaEngineTabVideoSource* videoSource) : mVideoSource(videoSource) {}
+      NS_IMETHOD Run();
+      RefPtr<MediaEngineTabVideoSource> mVideoSource;
+    };
+
 protected:
     ~MediaEngineTabVideoSource() {}
 
 private:
     int32_t mBufWidthMax;
     int32_t mBufHeightMax;
     int64_t mWindowId;
     bool mScrollWithPage;