Bug 1421134. P2 - run MediaCacheStream::SetReadMode() off the main thread. draft
authorJW Wang <jwwang@mozilla.com>
Tue, 28 Nov 2017 10:51:47 +0800
changeset 704835 1516d84b88f29e7cd8dd8241a983387025dd4c23
parent 704834 fa54a01a621d5d9fd5193d42042459efe6bff590
child 742178 8e73197de91aa9f996c0c87cdc2d4d174f83c884
push id91269
push userjwwang@mozilla.com
push dateWed, 29 Nov 2017 02:52:56 +0000
bugs1421134
milestone59.0a1
Bug 1421134. P2 - run MediaCacheStream::SetReadMode() off the main thread. MozReview-Commit-ID: A6ui5dtWhNt
dom/media/MediaCache.cpp
--- a/dom/media/MediaCache.cpp
+++ b/dom/media/MediaCache.cpp
@@ -2505,22 +2505,26 @@ MediaCacheStream::GetNextCachedDataInter
 
   NS_NOTREACHED("Should return in loop");
   return -1;
 }
 
 void
 MediaCacheStream::SetReadMode(ReadMode aMode)
 {
-  // TODO: Assert non-main thread.
-  AutoLock lock(mMediaCache->Monitor());
-  if (aMode == mCurrentMode)
-    return;
-  mCurrentMode = aMode;
-  mMediaCache->QueueUpdate(lock);
+  nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction(
+    "MediaCacheStream::SetReadMode",
+    [ this, client = RefPtr<ChannelMediaResource>(mClient), aMode ]() {
+      AutoLock lock(mMediaCache->Monitor());
+      if (!mClosed && mCurrentMode != aMode) {
+        mCurrentMode = aMode;
+        mMediaCache->QueueUpdate(lock);
+      }
+    });
+  OwnerThread()->Dispatch(r.forget());
 }
 
 void
 MediaCacheStream::SetPlaybackRate(uint32_t aBytesPerSecond)
 {
   MOZ_ASSERT(aBytesPerSecond > 0, "Zero playback rate not allowed");
 
   nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction(