From e672887f6fb38fd1d860f1d8b24293256a8d60a9 Mon Sep 17 00:00:00 2001 From: JW Wang Date: Thu, 16 Nov 2017 15:41:36 +0800 Subject: [PATCH] Bug 1418917. P1 - run some functions off the main thread. r=bechen,gerald MozReview-Commit-ID: Fn9OveV69hX --HG-- extra : rebase_source : 36ed72bea695f07694d83c418ba45d89cf1f03be extra : intermediate-source : e25c80e8ea6991b4f06bc4305b602c792a5b1e8a extra : source : d20765cfa8575943c62b933563e36ee9ffa4e765 --- dom/media/MediaCache.cpp | 73 +++++++++++++++++++++++++++++----------- dom/media/MediaCache.h | 5 +++ 2 files changed, 59 insertions(+), 19 deletions(-) diff --git a/dom/media/MediaCache.cpp b/dom/media/MediaCache.cpp index eb72b7f34414..2f7b123ec6a4 100644 --- a/dom/media/MediaCache.cpp +++ b/dom/media/MediaCache.cpp @@ -1937,17 +1937,23 @@ void MediaCacheStream::NotifyLoadID(uint32_t aLoadID) { MOZ_ASSERT(aLoadID > 0); - ReentrantMonitorAutoEnter mon(mMediaCache->GetReentrantMonitor()); - mLoadID = aLoadID; + + nsCOMPtr r = NS_NewRunnableFunction( + "MediaCacheStream::NotifyLoadID", + [ client = RefPtr(mClient), this, aLoadID ]() { + ReentrantMonitorAutoEnter mon(mMediaCache->GetReentrantMonitor()); + mLoadID = aLoadID; + }); + OwnerThread()->Dispatch(r.forget()); } void -MediaCacheStream::NotifyDataStarted(uint32_t aLoadID, - int64_t aOffset, - bool aSeekable, - int64_t aLength) +MediaCacheStream::NotifyDataStartedInternal(uint32_t aLoadID, + int64_t aOffset, + bool aSeekable, + int64_t aLength) { - NS_ASSERTION(NS_IsMainThread(), "Only call on main thread"); + MOZ_ASSERT(OwnerThread()->IsOnCurrentThread()); MOZ_ASSERT(aLoadID > 0); LOG("Stream %p DataStarted: %" PRId64 " aLoadID=%u aLength=%" PRId64, this, @@ -1999,6 +2005,23 @@ MediaCacheStream::UpdatePrincipal(nsIPrincipal* aPrincipal) } } +void +MediaCacheStream::NotifyDataStarted(uint32_t aLoadID, + int64_t aOffset, + bool aSeekable, + int64_t aLength) +{ + MOZ_ASSERT(NS_IsMainThread()); + MOZ_ASSERT(aLoadID > 0); + + nsCOMPtr r = NS_NewRunnableFunction( + "MediaCacheStream::NotifyDataStarted", + [ =, client = RefPtr(mClient) ]() { + NotifyDataStartedInternal(aLoadID, aOffset, aSeekable, aLength); + }); + OwnerThread()->Dispatch(r.forget()); +} + void MediaCacheStream::NotifyDataReceived(uint32_t aLoadID, uint32_t aCount, @@ -2460,12 +2483,18 @@ MediaCacheStream::SetReadMode(ReadMode aMode) void MediaCacheStream::SetPlaybackRate(uint32_t aBytesPerSecond) { - NS_ASSERTION(aBytesPerSecond > 0, "Zero playback rate not allowed"); - ReentrantMonitorAutoEnter mon(mMediaCache->GetReentrantMonitor()); - if (aBytesPerSecond == mPlaybackBytesPerSecond) - return; - mPlaybackBytesPerSecond = aBytesPerSecond; - mMediaCache->QueueUpdate(); + MOZ_ASSERT(aBytesPerSecond > 0, "Zero playback rate not allowed"); + + nsCOMPtr r = NS_NewRunnableFunction( + "MediaCacheStream::SetPlaybackRate", + [ =, client = RefPtr(mClient) ]() { + ReentrantMonitorAutoEnter mon(mMediaCache->GetReentrantMonitor()); + if (!mClosed && mPlaybackBytesPerSecond != aBytesPerSecond) { + mPlaybackBytesPerSecond = aBytesPerSecond; + mMediaCache->QueueUpdate(); + } + }); + OwnerThread()->Dispatch(r.forget()); } nsresult @@ -2493,12 +2522,18 @@ void MediaCacheStream::ThrottleReadahead(bool bThrottle) { MOZ_ASSERT(NS_IsMainThread()); - ReentrantMonitorAutoEnter mon(mMediaCache->GetReentrantMonitor()); - if (mThrottleReadahead != bThrottle) { - LOGI("Stream %p ThrottleReadahead %d", this, bThrottle); - mThrottleReadahead = bThrottle; - mMediaCache->QueueUpdate(); - } + + nsCOMPtr r = NS_NewRunnableFunction( + "MediaCacheStream::ThrottleReadahead", + [ client = RefPtr(mClient), this, bThrottle ]() { + ReentrantMonitorAutoEnter mon(mMediaCache->GetReentrantMonitor()); + if (!mClosed && mThrottleReadahead != bThrottle) { + LOGI("Stream %p ThrottleReadahead %d", this, bThrottle); + mThrottleReadahead = bThrottle; + mMediaCache->QueueUpdate(); + } + }); + OwnerThread()->Dispatch(r.forget()); } uint32_t diff --git a/dom/media/MediaCache.h b/dom/media/MediaCache.h index 578bae157036..4eb253a21970 100644 --- a/dom/media/MediaCache.h +++ b/dom/media/MediaCache.h @@ -454,6 +454,11 @@ private: // waiting on the media cache monitor. Called on the main thread only. void FlushPartialBlockInternal(bool aNotify, ReentrantMonitorAutoEnter& aReentrantMonitor); + void NotifyDataStartedInternal(uint32_t aLoadID, + int64_t aOffset, + bool aSeekable, + int64_t aLength); + void NotifyDataEndedInternal(uint32_t aLoadID, nsresult aStatus, bool aReopenOnError);