From 5bc8f166b3615865dbd453b35a69008e68e8e2f4 Mon Sep 17 00:00:00 2001 From: Matthew Gregan Date: Mon, 11 Aug 2014 13:21:18 +1200 Subject: [PATCH] Bug 1049327 - Assert that public MSE API is only called from the main thread. r=cajbir --- content/media/mediasource/MediaSource.cpp | 17 ++++++++++++++ content/media/mediasource/SourceBuffer.cpp | 22 +++++++++++++++++++ .../media/mediasource/SourceBufferList.cpp | 13 +++++++++++ 3 files changed, 52 insertions(+) diff --git a/content/media/mediasource/MediaSource.cpp b/content/media/mediasource/MediaSource.cpp index 90a2d2a08f4f..711c75b6dafa 100644 --- a/content/media/mediasource/MediaSource.cpp +++ b/content/media/mediasource/MediaSource.cpp @@ -127,12 +127,14 @@ MediaSource::Constructor(const GlobalObject& aGlobal, MediaSource::~MediaSource() { + MOZ_ASSERT(NS_IsMainThread()); MSE_API("MediaSource(%p)::~MediaSource()", this); } SourceBufferList* MediaSource::SourceBuffers() { + MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT_IF(mReadyState == MediaSourceReadyState::Closed, mSourceBuffers->IsEmpty()); return mSourceBuffers; } @@ -140,6 +142,7 @@ MediaSource::SourceBuffers() SourceBufferList* MediaSource::ActiveSourceBuffers() { + MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT_IF(mReadyState == MediaSourceReadyState::Closed, mActiveSourceBuffers->IsEmpty()); return mActiveSourceBuffers; } @@ -147,12 +150,14 @@ MediaSource::ActiveSourceBuffers() MediaSourceReadyState MediaSource::ReadyState() { + MOZ_ASSERT(NS_IsMainThread()); return mReadyState; } double MediaSource::Duration() { + MOZ_ASSERT(NS_IsMainThread()); if (mReadyState == MediaSourceReadyState::Closed) { return UnspecifiedNaN(); } @@ -162,6 +167,7 @@ MediaSource::Duration() void MediaSource::SetDuration(double aDuration, ErrorResult& aRv) { + MOZ_ASSERT(NS_IsMainThread()); MSE_API("MediaSource(%p)::SetDuration(aDuration=%f)", this, aDuration); if (aDuration < 0 || IsNaN(aDuration)) { aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR); @@ -178,6 +184,7 @@ MediaSource::SetDuration(double aDuration, ErrorResult& aRv) already_AddRefed MediaSource::AddSourceBuffer(const nsAString& aType, ErrorResult& aRv) { + MOZ_ASSERT(NS_IsMainThread()); nsresult rv = mozilla::IsTypeSupported(aType); MSE_API("MediaSource(%p)::AddSourceBuffer(aType=%s)%s", this, NS_ConvertUTF16toUTF8(aType).get(), @@ -215,6 +222,7 @@ MediaSource::AddSourceBuffer(const nsAString& aType, ErrorResult& aRv) void MediaSource::RemoveSourceBuffer(SourceBuffer& aSourceBuffer, ErrorResult& aRv) { + MOZ_ASSERT(NS_IsMainThread()); SourceBuffer* sourceBuffer = &aSourceBuffer; MSE_API("MediaSource(%p)::RemoveSourceBuffer(aSourceBuffer=%p)", this, sourceBuffer); if (!mSourceBuffers->Contains(sourceBuffer)) { @@ -245,6 +253,7 @@ MediaSource::RemoveSourceBuffer(SourceBuffer& aSourceBuffer, ErrorResult& aRv) void MediaSource::EndOfStream(const Optional& aError, ErrorResult& aRv) { + MOZ_ASSERT(NS_IsMainThread()); MSE_API("MediaSource(%p)::EndOfStream(aError=%d)", this, aError.WasPassed() ? uint32_t(aError.Value()) : 0); if (mReadyState != MediaSourceReadyState::Open || @@ -284,6 +293,7 @@ MediaSource::EndOfStream(const Optional& aError, Er /* static */ bool MediaSource::IsTypeSupported(const GlobalObject&, const nsAString& aType) { + MOZ_ASSERT(NS_IsMainThread()); nsresult rv = mozilla::IsTypeSupported(aType); MSE_API("MediaSource::IsTypeSupported(aType=%s)%s", NS_ConvertUTF16toUTF8(aType).get(), rv == NS_OK ? "" : " [not supported]"); @@ -293,6 +303,7 @@ MediaSource::IsTypeSupported(const GlobalObject&, const nsAString& aType) bool MediaSource::Attach(MediaSourceDecoder* aDecoder) { + MOZ_ASSERT(NS_IsMainThread()); MSE_DEBUG("MediaSource(%p)::Attach(aDecoder=%p) owner=%p", this, aDecoder, aDecoder->GetOwner()); MOZ_ASSERT(aDecoder); if (mReadyState != MediaSourceReadyState::Closed) { @@ -307,6 +318,7 @@ MediaSource::Attach(MediaSourceDecoder* aDecoder) void MediaSource::Detach() { + MOZ_ASSERT(NS_IsMainThread()); MSE_DEBUG("MediaSource(%p)::Detach() mDecoder=%p owner=%p", this, mDecoder.get(), mDecoder->GetOwner()); MOZ_ASSERT(mDecoder); @@ -325,6 +337,7 @@ MediaSource::MediaSource(nsPIDOMWindow* aWindow) , mReadyState(MediaSourceReadyState::Closed) , mWaitForDataMonitor("MediaSource.WaitForData.Monitor") { + MOZ_ASSERT(NS_IsMainThread()); mSourceBuffers = new SourceBufferList(this); mActiveSourceBuffers = new SourceBufferList(this); MSE_API("MediaSource(%p)::MediaSource(aWindow=%p) mSourceBuffers=%p mActiveSourceBuffers=%p", @@ -334,6 +347,7 @@ MediaSource::MediaSource(nsPIDOMWindow* aWindow) void MediaSource::SetReadyState(MediaSourceReadyState aState) { + MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(aState != mReadyState); MSE_DEBUG("MediaSource(%p)::SetReadyState(aState=%d) mReadyState=%d", this, aState, mReadyState); @@ -366,6 +380,7 @@ MediaSource::SetReadyState(MediaSourceReadyState aState) void MediaSource::DispatchSimpleEvent(const char* aName) { + MOZ_ASSERT(NS_IsMainThread()); MSE_API("MediaSource(%p) Dispatch event '%s'", this, aName); DispatchTrustedEvent(NS_ConvertUTF8toUTF16(aName)); } @@ -381,6 +396,7 @@ MediaSource::QueueAsyncSimpleEvent(const char* aName) void MediaSource::DurationChange(double aNewDuration, ErrorResult& aRv) { + MOZ_ASSERT(NS_IsMainThread()); MSE_DEBUG("MediaSource(%p)::DurationChange(aNewDuration=%f)", this, aNewDuration); if (mDuration == aNewDuration) { return; @@ -400,6 +416,7 @@ MediaSource::DurationChange(double aNewDuration, ErrorResult& aRv) void MediaSource::NotifyEvicted(double aStart, double aEnd) { + MOZ_ASSERT(NS_IsMainThread()); MSE_DEBUG("MediaSource(%p)::NotifyEvicted(aStart=%f, aEnd=%f)", this, aStart, aEnd); // Cycle through all SourceBuffers and tell them to evict data in // the given range. diff --git a/content/media/mediasource/SourceBuffer.cpp b/content/media/mediasource/SourceBuffer.cpp index 1c0b99ff2647..25d0f699090f 100644 --- a/content/media/mediasource/SourceBuffer.cpp +++ b/content/media/mediasource/SourceBuffer.cpp @@ -214,6 +214,7 @@ namespace dom { void SourceBuffer::SetMode(SourceBufferAppendMode aMode, ErrorResult& aRv) { + MOZ_ASSERT(NS_IsMainThread()); MSE_API("SourceBuffer(%p)::SetMode(aMode=%d)", this, aMode); if (!IsAttached() || mUpdating) { aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); @@ -231,6 +232,7 @@ SourceBuffer::SetMode(SourceBufferAppendMode aMode, ErrorResult& aRv) void SourceBuffer::SetTimestampOffset(double aTimestampOffset, ErrorResult& aRv) { + MOZ_ASSERT(NS_IsMainThread()); MSE_API("SourceBuffer(%p)::SetTimestampOffset(aTimestampOffset=%d)", this, aTimestampOffset); if (!IsAttached() || mUpdating) { aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); @@ -248,6 +250,7 @@ SourceBuffer::SetTimestampOffset(double aTimestampOffset, ErrorResult& aRv) already_AddRefed SourceBuffer::GetBuffered(ErrorResult& aRv) { + MOZ_ASSERT(NS_IsMainThread()); if (!IsAttached()) { aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); return nullptr; @@ -265,6 +268,7 @@ SourceBuffer::GetBuffered(ErrorResult& aRv) void SourceBuffer::SetAppendWindowStart(double aAppendWindowStart, ErrorResult& aRv) { + MOZ_ASSERT(NS_IsMainThread()); MSE_API("SourceBuffer(%p)::SetAppendWindowStart(aAppendWindowStart=%d)", this, aAppendWindowStart); if (!IsAttached() || mUpdating) { aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); @@ -280,6 +284,7 @@ SourceBuffer::SetAppendWindowStart(double aAppendWindowStart, ErrorResult& aRv) void SourceBuffer::SetAppendWindowEnd(double aAppendWindowEnd, ErrorResult& aRv) { + MOZ_ASSERT(NS_IsMainThread()); MSE_API("SourceBuffer(%p)::SetAppendWindowEnd(aAppendWindowEnd=%d)", this, aAppendWindowEnd); if (!IsAttached() || mUpdating) { aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); @@ -296,6 +301,7 @@ SourceBuffer::SetAppendWindowEnd(double aAppendWindowEnd, ErrorResult& aRv) void SourceBuffer::AppendBuffer(const ArrayBuffer& aData, ErrorResult& aRv) { + MOZ_ASSERT(NS_IsMainThread()); MSE_API("SourceBuffer(%p)::AppendBuffer(ArrayBuffer)", this); aData.ComputeLengthAndData(); AppendData(aData.Data(), aData.Length(), aRv); @@ -304,6 +310,7 @@ SourceBuffer::AppendBuffer(const ArrayBuffer& aData, ErrorResult& aRv) void SourceBuffer::AppendBuffer(const ArrayBufferView& aData, ErrorResult& aRv) { + MOZ_ASSERT(NS_IsMainThread()); MSE_API("SourceBuffer(%p)::AppendBuffer(ArrayBufferView)", this); aData.ComputeLengthAndData(); AppendData(aData.Data(), aData.Length(), aRv); @@ -312,6 +319,7 @@ SourceBuffer::AppendBuffer(const ArrayBufferView& aData, ErrorResult& aRv) void SourceBuffer::Abort(ErrorResult& aRv) { + MOZ_ASSERT(NS_IsMainThread()); MSE_API("SourceBuffer(%p)::Abort()", this); if (!IsAttached()) { aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); @@ -336,6 +344,7 @@ SourceBuffer::Abort(ErrorResult& aRv) void SourceBuffer::Remove(double aStart, double aEnd, ErrorResult& aRv) { + MOZ_ASSERT(NS_IsMainThread()); MSE_API("SourceBuffer(%p)::Remove(aStart=%f, aEnd=%f)", this, aStart, aEnd); if (!IsAttached() || mUpdating || mMediaSource->ReadyState() != MediaSourceReadyState::Open) { @@ -355,6 +364,7 @@ SourceBuffer::Remove(double aStart, double aEnd, ErrorResult& aRv) void SourceBuffer::Detach() { + MOZ_ASSERT(NS_IsMainThread()); MSE_DEBUG("SourceBuffer(%p)::Detach", this); Ended(); DiscardDecoder(); @@ -364,6 +374,7 @@ SourceBuffer::Detach() void SourceBuffer::Ended() { + MOZ_ASSERT(NS_IsMainThread()); MSE_DEBUG("SourceBuffer(%p)::Ended", this); if (mDecoder) { mDecoder->GetResource()->Ended(); @@ -381,6 +392,7 @@ SourceBuffer::SourceBuffer(MediaSource* aMediaSource, const nsACString& aType) , mUpdating(false) , mDecoderInitialized(false) { + MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(aMediaSource); mParser = ContainerParser::CreateForMIMEType(aType); MSE_DEBUG("SourceBuffer(%p)::SourceBuffer: Creating initial decoder.", this); @@ -396,6 +408,7 @@ SourceBuffer::Create(MediaSource* aMediaSource, const nsACString& aType) SourceBuffer::~SourceBuffer() { + MOZ_ASSERT(NS_IsMainThread()); MSE_DEBUG("SourceBuffer(%p)::~SourceBuffer", this); DiscardDecoder(); } @@ -415,6 +428,7 @@ SourceBuffer::WrapObject(JSContext* aCx) void SourceBuffer::DispatchSimpleEvent(const char* aName) { + MOZ_ASSERT(NS_IsMainThread()); MSE_API("SourceBuffer(%p) Dispatch event '%s'", this, aName); DispatchTrustedEvent(NS_ConvertUTF8toUTF16(aName)); } @@ -430,6 +444,7 @@ SourceBuffer::QueueAsyncSimpleEvent(const char* aName) bool SourceBuffer::InitNewDecoder() { + MOZ_ASSERT(NS_IsMainThread()); MSE_DEBUG("SourceBuffer(%p)::InitNewDecoder", this); MOZ_ASSERT(!mDecoder); MediaSourceDecoder* parentDecoder = mMediaSource->GetDecoder(); @@ -445,6 +460,7 @@ SourceBuffer::InitNewDecoder() void SourceBuffer::DiscardDecoder() { + MOZ_ASSERT(NS_IsMainThread()); MSE_DEBUG("SourceBuffer(%p)::DiscardDecoder mDecoder=%p", this, mDecoder.get()); if (mDecoder) { mDecoder->SetDiscarded(); @@ -456,6 +472,7 @@ SourceBuffer::DiscardDecoder() void SourceBuffer::StartUpdating() { + MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(!mUpdating); mUpdating = true; QueueAsyncSimpleEvent("updatestart"); @@ -464,6 +481,7 @@ SourceBuffer::StartUpdating() void SourceBuffer::StopUpdating() { + MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(mUpdating); mUpdating = false; QueueAsyncSimpleEvent("update"); @@ -473,6 +491,7 @@ SourceBuffer::StopUpdating() void SourceBuffer::AbortUpdating() { + MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(mUpdating); mUpdating = false; QueueAsyncSimpleEvent("abort"); @@ -554,6 +573,7 @@ SourceBuffer::AppendData(const uint8_t* aData, uint32_t aLength, ErrorResult& aR void SourceBuffer::GetBufferedStartEndTime(double* aStart, double* aEnd) { + MOZ_ASSERT(NS_IsMainThread()); ErrorResult dummy; nsRefPtr ranges = GetBuffered(dummy); if (!ranges || ranges->Length() == 0) { @@ -567,6 +587,7 @@ SourceBuffer::GetBufferedStartEndTime(double* aStart, double* aEnd) void SourceBuffer::Evict(double aStart, double aEnd) { + MOZ_ASSERT(NS_IsMainThread()); MSE_DEBUG("SourceBuffer(%p)::Evict(aStart=%f, aEnd=%f)", this, aStart, aEnd); if (!mDecoder) { return; @@ -582,6 +603,7 @@ SourceBuffer::Evict(double aStart, double aEnd) bool SourceBuffer::ContainsTime(double aTime) { + MOZ_ASSERT(NS_IsMainThread()); ErrorResult dummy; nsRefPtr ranges = GetBuffered(dummy); if (!ranges || ranges->Length() == 0) { diff --git a/content/media/mediasource/SourceBufferList.cpp b/content/media/mediasource/SourceBufferList.cpp index b60f69caebe4..5e2c3207c930 100644 --- a/content/media/mediasource/SourceBufferList.cpp +++ b/content/media/mediasource/SourceBufferList.cpp @@ -42,6 +42,7 @@ SourceBufferList::~SourceBufferList() SourceBuffer* SourceBufferList::IndexedGetter(uint32_t aIndex, bool& aFound) { + MOZ_ASSERT(NS_IsMainThread()); aFound = aIndex < mSourceBuffers.Length(); return aFound ? mSourceBuffers[aIndex] : nullptr; } @@ -49,12 +50,14 @@ SourceBufferList::IndexedGetter(uint32_t aIndex, bool& aFound) uint32_t SourceBufferList::Length() { + MOZ_ASSERT(NS_IsMainThread()); return mSourceBuffers.Length(); } void SourceBufferList::Append(SourceBuffer* aSourceBuffer) { + MOZ_ASSERT(NS_IsMainThread()); mSourceBuffers.AppendElement(aSourceBuffer); QueueAsyncSimpleEvent("addsourcebuffer"); } @@ -62,6 +65,7 @@ SourceBufferList::Append(SourceBuffer* aSourceBuffer) void SourceBufferList::Remove(SourceBuffer* aSourceBuffer) { + MOZ_ASSERT(NS_IsMainThread()); MOZ_ALWAYS_TRUE(mSourceBuffers.RemoveElement(aSourceBuffer)); aSourceBuffer->Detach(); QueueAsyncSimpleEvent("removesourcebuffer"); @@ -70,12 +74,14 @@ SourceBufferList::Remove(SourceBuffer* aSourceBuffer) bool SourceBufferList::Contains(SourceBuffer* aSourceBuffer) { + MOZ_ASSERT(NS_IsMainThread()); return mSourceBuffers.Contains(aSourceBuffer); } void SourceBufferList::Clear() { + MOZ_ASSERT(NS_IsMainThread()); for (uint32_t i = 0; i < mSourceBuffers.Length(); ++i) { mSourceBuffers[i]->Detach(); } @@ -86,12 +92,14 @@ SourceBufferList::Clear() bool SourceBufferList::IsEmpty() { + MOZ_ASSERT(NS_IsMainThread()); return mSourceBuffers.IsEmpty(); } bool SourceBufferList::AnyUpdating() { + MOZ_ASSERT(NS_IsMainThread()); for (uint32_t i = 0; i < mSourceBuffers.Length(); ++i) { if (mSourceBuffers[i]->Updating()) { return true; @@ -103,6 +111,7 @@ SourceBufferList::AnyUpdating() void SourceBufferList::Remove(double aStart, double aEnd, ErrorResult& aRv) { + MOZ_ASSERT(NS_IsMainThread()); MSE_DEBUG("SourceBufferList(%p)::Remove(aStart=%f, aEnd=%f", this, aStart, aEnd); for (uint32_t i = 0; i < mSourceBuffers.Length(); ++i) { mSourceBuffers[i]->Remove(aStart, aEnd, aRv); @@ -115,6 +124,7 @@ SourceBufferList::Remove(double aStart, double aEnd, ErrorResult& aRv) void SourceBufferList::Evict(double aStart, double aEnd) { + MOZ_ASSERT(NS_IsMainThread()); MSE_DEBUG("SourceBufferList(%p)::Evict(aStart=%f, aEnd=%f)", this, aStart, aEnd); for (uint32_t i = 0; i < mSourceBuffers.Length(); ++i) { mSourceBuffers[i]->Evict(aStart, aEnd); @@ -124,6 +134,7 @@ SourceBufferList::Evict(double aStart, double aEnd) bool SourceBufferList::AllContainsTime(double aTime) { + MOZ_ASSERT(NS_IsMainThread()); for (uint32_t i = 0; i < mSourceBuffers.Length(); ++i) { if (!mSourceBuffers[i]->ContainsTime(aTime)) { return false; @@ -135,6 +146,7 @@ SourceBufferList::AllContainsTime(double aTime) void SourceBufferList::Ended() { + MOZ_ASSERT(NS_IsMainThread()); for (uint32_t i = 0; i < mSourceBuffers.Length(); ++i) { mSourceBuffers[i]->Ended(); } @@ -143,6 +155,7 @@ SourceBufferList::Ended() void SourceBufferList::DispatchSimpleEvent(const char* aName) { + MOZ_ASSERT(NS_IsMainThread()); MSE_API("SourceBufferList(%p) Dispatch event '%s'", this, aName); DispatchTrustedEvent(NS_ConvertUTF8toUTF16(aName)); }