author | Dan Minor <dminor@mozilla.com> |
Thu, 15 Jun 2017 11:51:28 -0400 | |
changeset 368981 | 808e35c5d4260aa04f30483884c4204a9157a785 |
parent 368980 | d830efaed2448a14fdc1abec1fd2fd3425008689 |
child 368982 | ace13e49c0fbbcc06ea107f9b092ce0f0cb0d6f5 |
push id | 32179 |
push user | kwierso@gmail.com |
push date | Sat, 15 Jul 2017 00:14:54 +0000 |
treeherder | mozilla-central@bd1b6a4e5d8e [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | karlt |
bugs | 1373727 |
milestone | 56.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/dom/media/webaudio/AudioBufferSourceNode.cpp +++ b/dom/media/webaudio/AudioBufferSourceNode.cpp @@ -577,18 +577,20 @@ public: uint32_t mBufferEnd; uint32_t mLoopStart; uint32_t mLoopEnd; uint32_t mBufferPosition; int32_t mBufferSampleRate; int32_t mResamplerOutRate; uint32_t mChannels; float mDopplerShift; - AudioNodeStream* mDestination; - AudioNodeStream* mSource; + RefPtr<AudioNodeStream> mDestination; + + // mSource deletes the engine in its destructor. + AudioNodeStream* MOZ_NON_OWNING_REF mSource; AudioParamTimeline mPlaybackRateTimeline; AudioParamTimeline mDetuneTimeline; bool mLoop; }; AudioBufferSourceNode::AudioBufferSourceNode(AudioContext* aContext) : AudioScheduledSourceNode(aContext, 2,
--- a/dom/media/webaudio/AudioNode.h +++ b/dom/media/webaudio/AudioNode.h @@ -172,18 +172,18 @@ public: size_t amount = 0; if (mStreamPort) { amount += mStreamPort->SizeOfIncludingThis(aMallocSizeOf); } return amount; } - // Weak reference. - AudioNode* mInputNode; + // The InputNode is destroyed when mInputNode is disconnected. + AudioNode* MOZ_NON_OWNING_REF mInputNode; RefPtr<MediaInputPort> mStreamPort; // The index of the input port this node feeds into. // This is not used for connections to AudioParams. uint32_t mInputPort; // The index of the output port this node comes out of. uint32_t mOutputPort; };
--- a/dom/media/webaudio/AudioNodeEngine.h +++ b/dom/media/webaudio/AudioNodeEngine.h @@ -388,17 +388,18 @@ public: void SizeOfIncludingThis(MallocSizeOf aMallocSizeOf, AudioNodeSizes& aUsage) const { aUsage.mEngine = SizeOfIncludingThis(aMallocSizeOf); aUsage.mNodeType = mNodeType; } private: - dom::AudioNode* mNode; // main thread only + // This is cleared from AudioNode::DestroyMediaStream() + dom::AudioNode* MOZ_NON_OWNING_REF mNode; // main thread only const char* const mNodeType; const uint16_t mInputCount; const uint16_t mOutputCount; protected: const RefPtr<AbstractThread> mAbstractMainThread; };
--- a/dom/media/webaudio/AudioNodeStream.cpp +++ b/dom/media/webaudio/AudioNodeStream.cpp @@ -139,17 +139,19 @@ AudioNodeStream::SetStreamTimeParameter( mRelativeToStream(aRelativeToStream), mIndex(aIndex) {} void Run() override { static_cast<AudioNodeStream*>(mStream)-> SetStreamTimeParameterImpl(mIndex, mRelativeToStream, mStreamTime); } double mStreamTime; - MediaStream* mRelativeToStream; + MediaStream* MOZ_UNSAFE_REF("ControlMessages are processed in order. This \ +destination stream is not yet destroyed. Its (future) destroy message will be \ +processed after this message.") mRelativeToStream; uint32_t mIndex; }; GraphImpl()->AppendMessage(MakeUnique<Message>(this, aIndex, aContext->DestinationStream(), aStreamTime)); }
--- a/dom/media/webaudio/BiquadFilterNode.cpp +++ b/dom/media/webaudio/BiquadFilterNode.cpp @@ -229,17 +229,17 @@ public: } size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override { return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf); } private: - AudioNodeStream* mDestination; + RefPtr<AudioNodeStream> mDestination; BiquadFilterType mType; AudioParamTimeline mFrequency; AudioParamTimeline mDetune; AudioParamTimeline mQ; AudioParamTimeline mGain; nsTArray<WebCore::Biquad> mBiquads; uint64_t mWindowID; };
--- a/dom/media/webaudio/ConstantSourceNode.cpp +++ b/dom/media/webaudio/ConstantSourceNode.cpp @@ -129,18 +129,19 @@ public: return amount; } size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override { return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf); } - AudioNodeStream* mSource; - AudioNodeStream* mDestination; + // mSource deletes the engine in its destructor. + AudioNodeStream* MOZ_NON_OWNING_REF mSource; + RefPtr<AudioNodeStream> mDestination; StreamTime mStart; StreamTime mStop; AudioParamTimeline mOffset; }; ConstantSourceNode::ConstantSourceNode(AudioContext* aContext) : AudioScheduledSourceNode(aContext, 1,
--- a/dom/media/webaudio/DelayNode.cpp +++ b/dom/media/webaudio/DelayNode.cpp @@ -176,17 +176,17 @@ public: return amount; } size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override { return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf); } - AudioNodeStream* mDestination; + RefPtr<AudioNodeStream> mDestination; AudioParamTimeline mDelay; DelayBuffer mBuffer; double mMaxDelay; bool mHaveProducedBeforeInput; // How much data we have in our buffer which needs to be flushed out when our inputs // finish. int32_t mLeftOverData; };
--- a/dom/media/webaudio/DynamicsCompressorNode.cpp +++ b/dom/media/webaudio/DynamicsCompressorNode.cpp @@ -169,17 +169,17 @@ private: RefPtr<AudioNodeStream> mStream; float mReduction; }; mAbstractMainThread->Dispatch(do_AddRef(new Command(aStream, aReduction))); } private: - AudioNodeStream* mDestination; + RefPtr<AudioNodeStream> mDestination; AudioParamTimeline mThreshold; AudioParamTimeline mKnee; AudioParamTimeline mRatio; AudioParamTimeline mAttack; AudioParamTimeline mRelease; nsAutoPtr<DynamicsCompressor> mCompressor; };
--- a/dom/media/webaudio/GainNode.cpp +++ b/dom/media/webaudio/GainNode.cpp @@ -96,27 +96,27 @@ public: AudioBlockCopyChannelWithScale(inputBuffer, alignedComputedGain, buffer); } } } size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override { // Not owned: - // - mDestination (probably) + // - mDestination - MediaStreamGraphImpl::CollectSizesForMemoryReport() accounts for mDestination. // - mGain - Internal ref owned by AudioNode return AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf); } size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override { return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf); } - AudioNodeStream* mDestination; + RefPtr<AudioNodeStream> mDestination; AudioParamTimeline mGain; }; GainNode::GainNode(AudioContext* aContext) : AudioNode(aContext, 2, ChannelCountMode::Max, ChannelInterpretation::Speakers)
--- a/dom/media/webaudio/IIRFilterNode.cpp +++ b/dom/media/webaudio/IIRFilterNode.cpp @@ -120,17 +120,17 @@ public: } size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override { return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf); } private: - AudioNodeStream* mDestination; + RefPtr<AudioNodeStream> mDestination; nsTArray<nsAutoPtr<blink::IIRFilter>> mIIRFilters; AudioDoubleArray mFeedforward; AudioDoubleArray mFeedback; uint64_t mWindowID; }; IIRFilterNode::IIRFilterNode(AudioContext* aContext, const Sequence<double>& aFeedforward,
--- a/dom/media/webaudio/OscillatorNode.cpp +++ b/dom/media/webaudio/OscillatorNode.cpp @@ -384,18 +384,19 @@ public: return amount; } size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override { return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf); } - AudioNodeStream* mSource; - AudioNodeStream* mDestination; + // mSource deletes this engine in its destructor + AudioNodeStream* MOZ_NON_OWNING_REF mSource; + RefPtr<AudioNodeStream> mDestination; StreamTime mStart; StreamTime mStop; AudioParamTimeline mFrequency; AudioParamTimeline mDetune; OscillatorType mType; float mPhase; float mFinalFrequency; float mPhaseIncrement;
--- a/dom/media/webaudio/PannerNode.cpp +++ b/dom/media/webaudio/PannerNode.cpp @@ -257,17 +257,17 @@ public: return amount; } size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override { return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf); } - AudioNodeStream* mDestination; + RefPtr<AudioNodeStream> mDestination; // This member is set on the main thread, but is not accessed on the rendering // thread untile mPanningModelFunction has changed, and this happens strictly // later, via a MediaStreamGraph ControlMessage. nsAutoPtr<HRTFPanner> mHRTFPanner; typedef void (PannerNodeEngine::*PanningModelFunction)(const AudioBlock& aInput, AudioBlock* aOutput, StreamTime tick); PanningModelFunction mPanningModelFunction; typedef float (PannerNodeEngine::*DistanceModelFunction)(double aDistance); DistanceModelFunction mDistanceModelFunction;
--- a/dom/media/webaudio/ScriptProcessorNode.cpp +++ b/dom/media/webaudio/ScriptProcessorNode.cpp @@ -471,17 +471,17 @@ private: RefPtr<Command> command = new Command(aStream, mInputBuffer.forget(), playbackTime); mAbstractMainThread->Dispatch(command.forget()); } friend class ScriptProcessorNode; - AudioNodeStream* mDestination; + RefPtr<AudioNodeStream> mDestination; nsAutoPtr<SharedBuffers> mSharedBuffers; RefPtr<ThreadSharedFloatArrayBufferList> mInputBuffer; const uint32_t mBufferSize; const uint32_t mInputChannelCount; // The write index into the current input buffer uint32_t mInputWriteIndex; bool mIsConnected = false; };
--- a/dom/media/webaudio/StereoPannerNode.cpp +++ b/dom/media/webaudio/StereoPannerNode.cpp @@ -161,17 +161,17 @@ public: } } virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override { return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf); } - AudioNodeStream* mDestination; + RefPtr<AudioNodeStream> mDestination; AudioParamTimeline mPan; }; StereoPannerNode::StereoPannerNode(AudioContext* aContext) : AudioNode(aContext, 2, ChannelCountMode::Clamped_max, ChannelInterpretation::Speakers)
--- a/dom/media/webaudio/blink/HRTFDatabaseLoader.cpp +++ b/dom/media/webaudio/blink/HRTFDatabaseLoader.cpp @@ -117,17 +117,18 @@ public: { } NS_IMETHOD Run() override { mLoader->MainThreadRelease(); return NS_OK; } private: - HRTFDatabaseLoader* mLoader; + // Ownership transferred by ProxyRelease + HRTFDatabaseLoader* MOZ_OWNING_REF mLoader; }; void HRTFDatabaseLoader::ProxyRelease() { nsCOMPtr<nsIEventTarget> mainTarget = GetMainThreadEventTarget(); if (MOZ_LIKELY(mainTarget)) { RefPtr<ProxyReleaseEvent> event = new ProxyReleaseEvent(this); DebugOnly<nsresult> rv =
--- a/dom/media/webaudio/blink/HRTFDatabaseLoader.h +++ b/dom/media/webaudio/blink/HRTFDatabaseLoader.h @@ -121,17 +121,18 @@ private: { } size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const { return mLoader ? mLoader->sizeOfIncludingThis(aMallocSizeOf) : 0; } - HRTFDatabaseLoader* mLoader; + // The HRTFDatabaseLoader removes itself from s_loaderMap on destruction. + HRTFDatabaseLoader* MOZ_NON_OWNING_REF mLoader; }; // Keeps track of loaders on a per-sample-rate basis. static nsTHashtable<LoaderByRateEntry> *s_loaderMap; // singleton mozilla::Atomic<int> m_refCnt; nsAutoRef<HRTFDatabase> m_hrtfDatabase;