Bug 1407940 - P1. Use Mutex in place of Monitor. r?gerald
MozReview-Commit-ID: Dy2WhS0YOq1
--- a/dom/media/mediasource/TrackBuffersManager.cpp
+++ b/dom/media/mediasource/TrackBuffersManager.cpp
@@ -102,17 +102,17 @@ TrackBuffersManager::TrackBuffersManager
"TrackBuffersManager::mParentDecoder", aParentDecoder, false /* strict */))
, mAbstractMainThread(aParentDecoder->AbstractMainThread())
, mEnded(false)
, mVideoEvictionThreshold(Preferences::GetUint("media.mediasource.eviction_threshold.video",
100 * 1024 * 1024))
, mAudioEvictionThreshold(Preferences::GetUint("media.mediasource.eviction_threshold.audio",
20 * 1024 * 1024))
, mEvictionState(EvictionState::NO_EVICTION_NEEDED)
- , mMonitor("TrackBuffersManager")
+ , mMutex("TrackBuffersManager")
{
MOZ_ASSERT(NS_IsMainThread(), "Must be instanciated on the main thread");
}
TrackBuffersManager::~TrackBuffersManager()
{
ShutdownDemuxers();
}
@@ -346,17 +346,17 @@ TrackBuffersManager::EvictData(const Tim
TimeIntervals
TrackBuffersManager::Buffered() const
{
MSE_DEBUG("");
// http://w3c.github.io/media-source/index.html#widl-SourceBuffer-buffered
- MonitorAutoLock mon(mMonitor);
+ MutexAutoLock mut(mMutex);
nsTArray<const TimeIntervals*> tracks;
if (HasVideo()) {
tracks.AppendElement(&mVideoBufferedRanges);
}
if (HasAudio()) {
tracks.AppendElement(&mAudioBufferedRanges);
}
@@ -630,17 +630,17 @@ TrackBuffersManager::CodedFrameRemoval(T
}
return dataRemoved;
}
void
TrackBuffersManager::UpdateBufferedRanges()
{
- MonitorAutoLock mon(mMonitor);
+ MutexAutoLock mut(mMutex);
mVideoBufferedRanges = mVideoTracks.mSanitizedBufferedRanges;
mAudioBufferedRanges = mAudioTracks.mSanitizedBufferedRanges;
#if DEBUG
if (HasVideo()) {
MSE_DEBUG("after video ranges=%s",
DumpTimeRanges(mVideoTracks.mBufferedRanges).get());
@@ -1172,17 +1172,17 @@ TrackBuffersManager::OnDemuxerInitDone(c
}
info.mCrypto = *crypto;
// We clear our crypto init data array, so the MediaFormatReader will
// not emit an encrypted event for the same init data again.
info.mCrypto.mInitDatas.Clear();
}
{
- MonitorAutoLock mon(mMonitor);
+ MutexAutoLock mut(mMutex);
mInfo = info;
}
// We now have a valid init data ; we can store it for later use.
mInitData = mParser->InitData();
// 3. Remove the initialization segment bytes from the beginning of the input buffer.
// This step has already been done in InitializationSegmentReceived when we
@@ -1866,17 +1866,17 @@ TrackBuffersManager::InsertFrames(TrackB
}
}
void
TrackBuffersManager::UpdateHighestTimestamp(TrackData& aTrackData,
const media::TimeUnit& aHighestTime)
{
if (aHighestTime > aTrackData.mHighestStartTimestamp) {
- MonitorAutoLock mon(mMonitor);
+ MutexAutoLock mut(mMutex);
aTrackData.mHighestStartTimestamp = aHighestTime;
}
}
uint32_t
TrackBuffersManager::RemoveFrames(const TimeIntervals& aIntervals,
TrackData& aTrackData,
uint32_t aStartIndex)
@@ -1960,17 +1960,17 @@ TrackBuffersManager::RemoveFrames(const
} else if (aTrackData.mNextGetSampleIndex.ref() > lastRemovedIndex) {
uint32_t samplesRemoved = lastRemovedIndex - firstRemovedIndex.ref() + 1;
aTrackData.mNextGetSampleIndex.ref() -= samplesRemoved;
if (aTrackData.mEvictionIndex.mLastIndex > lastRemovedIndex) {
MOZ_DIAGNOSTIC_ASSERT(
aTrackData.mEvictionIndex.mLastIndex >= samplesRemoved &&
aTrackData.mEvictionIndex.mEvictable >= sizeRemoved,
"Invalid eviction index");
- MonitorAutoLock mon(mMonitor);
+ MutexAutoLock mut(mMutex);
aTrackData.mEvictionIndex.mLastIndex -= samplesRemoved;
aTrackData.mEvictionIndex.mEvictable -= sizeRemoved;
} else {
ResetEvictionIndex(aTrackData);
}
}
}
@@ -1999,17 +1999,17 @@ TrackBuffersManager::RemoveFrames(const
// The sample with the highest presentation time got removed.
// Rescan the trackbuffer to determine the new one.
TimeUnit highestStartTime;
for (const auto& sample : data) {
if (sample->mTime > highestStartTime) {
highestStartTime = sample->mTime;
}
}
- MonitorAutoLock mon(mMonitor);
+ MutexAutoLock mut(mMutex);
aTrackData.mHighestStartTimestamp = highestStartTime;
}
return firstRemovedIndex.ref();
}
void
TrackBuffersManager::RecreateParser(bool aReuseInitData)
@@ -2061,17 +2061,17 @@ TrackBuffersManager::SetAppendState(Appe
MSE_DEBUG("AppendState changed from %s to %s",
AppendStateToStr(mSourceBufferAttributes->GetAppendState()), AppendStateToStr(aAppendState));
mSourceBufferAttributes->SetAppendState(aAppendState);
}
MediaInfo
TrackBuffersManager::GetMetadata() const
{
- MonitorAutoLock mon(mMonitor);
+ MutexAutoLock mut(mMutex);
return mInfo;
}
const TimeIntervals&
TrackBuffersManager::Buffered(TrackInfo::TrackType aTrack) const
{
MOZ_ASSERT(OnTaskQueue());
return GetTracksData(aTrack).mBufferedRanges;
@@ -2082,67 +2082,67 @@ TrackBuffersManager::HighestStartTime(Tr
{
MOZ_ASSERT(OnTaskQueue());
return GetTracksData(aTrack).mHighestStartTimestamp;
}
TimeIntervals
TrackBuffersManager::SafeBuffered(TrackInfo::TrackType aTrack) const
{
- MonitorAutoLock mon(mMonitor);
+ MutexAutoLock mut(mMutex);
return aTrack == TrackInfo::kVideoTrack
? mVideoBufferedRanges
: mAudioBufferedRanges;
}
TimeUnit
TrackBuffersManager::HighestStartTime() const
{
- MonitorAutoLock mon(mMonitor);
+ MutexAutoLock mut(mMutex);
TimeUnit highestStartTime;
for (auto& track : GetTracksList()) {
highestStartTime =
std::max(track->mHighestStartTimestamp, highestStartTime);
}
return highestStartTime;
}
TimeUnit
TrackBuffersManager::HighestEndTime() const
{
- MonitorAutoLock mon(mMonitor);
+ MutexAutoLock mut(mMutex);
nsTArray<const TimeIntervals*> tracks;
if (HasVideo()) {
tracks.AppendElement(&mVideoBufferedRanges);
}
if (HasAudio()) {
tracks.AppendElement(&mAudioBufferedRanges);
}
return HighestEndTime(tracks);
}
TimeUnit
TrackBuffersManager::HighestEndTime(
nsTArray<const TimeIntervals*>& aTracks) const
{
- mMonitor.AssertCurrentThreadOwns();
+ mMutex.AssertCurrentThreadOwns();
TimeUnit highestEndTime;
for (const auto& trackRanges : aTracks) {
highestEndTime = std::max(trackRanges->GetEnd(), highestEndTime);
}
return highestEndTime;
}
void
TrackBuffersManager::ResetEvictionIndex(TrackData& aTrackData)
{
- MonitorAutoLock mon(mMonitor);
+ MutexAutoLock mut(mMutex);
aTrackData.mEvictionIndex.Reset();
}
void
TrackBuffersManager::UpdateEvictionIndex(TrackData& aTrackData,
uint32_t currentIndex)
{
uint32_t evictable = 0;
@@ -2152,17 +2152,17 @@ TrackBuffersManager::UpdateEvictionIndex
MOZ_DIAGNOSTIC_ASSERT(currentIndex == data.Length() ||
data[currentIndex]->mKeyframe,"Must stop at keyframe");
for (uint32_t i = aTrackData.mEvictionIndex.mLastIndex; i < currentIndex;
i++) {
evictable += data[i]->ComputedSizeOfIncludingThis();
}
aTrackData.mEvictionIndex.mLastIndex = currentIndex;
- MonitorAutoLock mon(mMonitor);
+ MutexAutoLock mut(mMutex);
aTrackData.mEvictionIndex.mEvictable += evictable;
}
const TrackBuffersManager::TrackBuffer&
TrackBuffersManager::GetTrackBuffer(TrackInfo::TrackType aTrack) const
{
MOZ_ASSERT(OnTaskQueue());
return GetTracksData(aTrack).GetTrackBuffer();
@@ -2530,17 +2530,17 @@ TrackBuffersManager::FindCurrentPosition
// Still not found.
return -1;
}
uint32_t
TrackBuffersManager::Evictable(TrackInfo::TrackType aTrack) const
{
- MonitorAutoLock mon(mMonitor);
+ MutexAutoLock mut(mMutex);
return GetTracksData(aTrack).mEvictionIndex.mEvictable;
}
TimeUnit
TrackBuffersManager::GetNextRandomAccessPoint(TrackInfo::TrackType aTrack,
const TimeUnit& aFuzz)
{
MOZ_ASSERT(OnTaskQueue());
--- a/dom/media/mediasource/TrackBuffersManager.h
+++ b/dom/media/mediasource/TrackBuffersManager.h
@@ -4,17 +4,17 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef MOZILLA_TRACKBUFFERSMANAGER_H_
#define MOZILLA_TRACKBUFFERSMANAGER_H_
#include "mozilla/Atomics.h"
#include "mozilla/Maybe.h"
-#include "mozilla/Monitor.h"
+#include "mozilla/Mutex.h"
#include "AutoTaskQueue.h"
#include "MediaContainerType.h"
#include "MediaData.h"
#include "MediaDataDemuxer.h"
#include "MediaResult.h"
#include "MediaSourceDecoder.h"
#include "SourceBufferTask.h"
@@ -30,48 +30,48 @@ class MediaByteBuffer;
class MediaRawData;
class MediaSourceDemuxer;
class SourceBufferResource;
class SourceBufferTaskQueue
{
public:
SourceBufferTaskQueue()
- : mMonitor("SourceBufferTaskQueue")
+ : mMutex("SourceBufferTaskQueue")
{}
~SourceBufferTaskQueue()
{
MOZ_ASSERT(mQueue.IsEmpty(), "All tasks must have been processed");
}
void Push(SourceBufferTask* aTask)
{
- MonitorAutoLock mon(mMonitor);
+ MutexAutoLock mut(mMutex);
mQueue.AppendElement(aTask);
}
already_AddRefed<SourceBufferTask> Pop()
{
- MonitorAutoLock mon(mMonitor);
+ MutexAutoLock mut(mMutex);
if (!mQueue.Length()) {
return nullptr;
}
RefPtr<SourceBufferTask> task = Move(mQueue[0]);
mQueue.RemoveElementAt(0);
return task.forget();
}
nsTArray<SourceBufferTask>::size_type Length() const
{
- MonitorAutoLock mon(mMonitor);
+ MutexAutoLock mut(mMutex);
return mQueue.Length();
}
private:
- mutable Monitor mMonitor;
+ mutable Mutex mMutex;
nsTArray<RefPtr<SourceBufferTask>> mQueue;
};
class TrackBuffersManager
{
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(TrackBuffersManager);
@@ -501,17 +501,17 @@ private:
{
NO_EVICTION_NEEDED,
EVICTION_NEEDED,
EVICTION_COMPLETED,
};
Atomic<EvictionState> mEvictionState;
// Monitor to protect following objects accessed across multiple threads.
- mutable Monitor mMonitor;
+ mutable Mutex mMutex;
// Stable audio and video track time ranges.
media::TimeIntervals mVideoBufferedRanges;
media::TimeIntervals mAudioBufferedRanges;
// MediaInfo of the first init segment read.
MediaInfo mInfo;
};
} // namespace mozilla