From 8beeac4ae5ae191fb6bba2df78f473a783d180ff Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Wed, 3 Jul 2013 22:17:25 -0400 Subject: [PATCH] Backed out 2 changesets (bug 890072) for possible leaks Backed out changeset 5e815a5ca50d (bug 890072) Backed out changeset 7151ab8ff70c (bug 890072) --- content/media/webaudio/ConvolverNode.cpp | 24 -------- content/media/webaudio/ConvolverNode.h | 4 -- content/media/webaudio/DelayNode.cpp | 37 +++++++++++- content/media/webaudio/DelayNode.h | 2 - .../media/webaudio/PlayingRefChangeHandler.h | 57 ------------------- 5 files changed, 36 insertions(+), 88 deletions(-) delete mode 100644 content/media/webaudio/PlayingRefChangeHandler.h diff --git a/content/media/webaudio/ConvolverNode.cpp b/content/media/webaudio/ConvolverNode.cpp index e8d48069f5ac..f125fc72fafd 100644 --- a/content/media/webaudio/ConvolverNode.cpp +++ b/content/media/webaudio/ConvolverNode.cpp @@ -26,12 +26,10 @@ NS_IMPL_RELEASE_INHERITED(ConvolverNode, AudioNode) class ConvolverNodeEngine : public AudioNodeEngine { - typedef PlayingRefChangeHandler PlayingRefChanged; public: ConvolverNodeEngine(AudioNode* aNode, bool aNormalize) : AudioNodeEngine(aNode) , mBufferLength(0) - , mLeftOverData(INT32_MIN) , mSampleRate(0.0f) , mUseBackgroundThreads(!aNode->Context()->IsOffline()) , mNormalize(aNormalize) @@ -53,7 +51,6 @@ public: mBuffer = nullptr; mSampleRate = 0.0f; mBufferLength = aParam; - mLeftOverData = INT32_MIN; break; case SAMPLE_RATE: mSampleRate = aParam; @@ -95,7 +92,6 @@ public: if (!mBuffer || !mBufferLength || !mSampleRate) { mReverb = nullptr; mSeenInput = false; - mLeftOverData = INT32_MIN; return; } @@ -140,32 +136,12 @@ public: AllocateAudioBlock(numChannels, aOutput); mReverb->process(&input, aOutput, WEBAUDIO_BLOCK_SIZE); - - if (!aInput.IsNull()) { - if (mLeftOverData == INT32_MIN) { - // Start counting the left over data - mLeftOverData = mBufferLength + WEBAUDIO_BLOCK_SIZE; - MOZ_ASSERT(mLeftOverData > 0); - - nsRefPtr refchanged = - new PlayingRefChanged(aStream, PlayingRefChanged::ADDREF); - NS_DispatchToMainThread(refchanged); - } else { - mLeftOverData -= WEBAUDIO_BLOCK_SIZE; - } - if (mLeftOverData <= 0) { - nsRefPtr refchanged = - new PlayingRefChanged(aStream, PlayingRefChanged::RELEASE); - NS_DispatchToMainThread(refchanged); - } - } } private: nsRefPtr mBuffer; nsAutoPtr mReverb; int32_t mBufferLength; - int32_t mLeftOverData; float mSampleRate; bool mUseBackgroundThreads; bool mNormalize; diff --git a/content/media/webaudio/ConvolverNode.h b/content/media/webaudio/ConvolverNode.h index 08982882ff91..b79f271a73a6 100644 --- a/content/media/webaudio/ConvolverNode.h +++ b/content/media/webaudio/ConvolverNode.h @@ -9,7 +9,6 @@ #include "AudioNode.h" #include "AudioBuffer.h" -#include "PlayingRefChangeHandler.h" namespace mozilla { namespace dom { @@ -40,10 +39,7 @@ public: void SetNormalize(bool aNormal); private: - friend class PlayingRefChangeHandler; - nsRefPtr mBuffer; - SelfReference mPlayingRef; bool mNormalize; }; diff --git a/content/media/webaudio/DelayNode.cpp b/content/media/webaudio/DelayNode.cpp index 455d14678a8c..1e804458963c 100644 --- a/content/media/webaudio/DelayNode.cpp +++ b/content/media/webaudio/DelayNode.cpp @@ -25,7 +25,42 @@ NS_IMPL_RELEASE_INHERITED(DelayNode, AudioNode) class DelayNodeEngine : public AudioNodeEngine { - typedef PlayingRefChangeHandler PlayingRefChanged; + class PlayingRefChanged : public nsRunnable + { + public: + enum ChangeType { ADDREF, RELEASE }; + PlayingRefChanged(AudioNodeStream* aStream, ChangeType aChange) + : mStream(aStream) + , mChange(aChange) + { + } + + NS_IMETHOD Run() + { + nsRefPtr node; + { + // No need to keep holding the lock for the whole duration of this + // function, since we're holding a strong reference to it, so if + // we can obtain the reference, we will hold the node alive in + // this function. + MutexAutoLock lock(mStream->Engine()->NodeMutex()); + node = static_cast(mStream->Engine()->Node()); + } + if (node) { + if (mChange == ADDREF) { + node->mPlayingRef.Take(node); + } else if (mChange == RELEASE) { + node->mPlayingRef.Drop(node); + } + } + return NS_OK; + } + + private: + nsRefPtr mStream; + ChangeType mChange; + }; + public: DelayNodeEngine(AudioNode* aNode, AudioDestinationNode* aDestination) : AudioNodeEngine(aNode) diff --git a/content/media/webaudio/DelayNode.h b/content/media/webaudio/DelayNode.h index 23367343b1da..c796317123b9 100644 --- a/content/media/webaudio/DelayNode.h +++ b/content/media/webaudio/DelayNode.h @@ -9,7 +9,6 @@ #include "AudioNode.h" #include "AudioParam.h" -#include "PlayingRefChangeHandler.h" namespace mozilla { namespace dom { @@ -35,7 +34,6 @@ public: private: static void SendDelayToStream(AudioNode* aNode); friend class DelayNodeEngine; - friend class PlayingRefChangeHandler; private: nsRefPtr mDelay; diff --git a/content/media/webaudio/PlayingRefChangeHandler.h b/content/media/webaudio/PlayingRefChangeHandler.h deleted file mode 100644 index 4665680a3ce8..000000000000 --- a/content/media/webaudio/PlayingRefChangeHandler.h +++ /dev/null @@ -1,57 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim:set ts=2 sw=2 sts=2 et cindent: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * 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 PlayingRefChangeHandler_h__ -#define PlayingRefChangeHandler_h__ - -#include "nsThreadUtils.h" -#include "AudioNodeStream.h" - -namespace mozilla { -namespace dom { - -template -class PlayingRefChangeHandler : public nsRunnable -{ -public: - enum ChangeType { ADDREF, RELEASE }; - PlayingRefChangeHandler(AudioNodeStream* aStream, ChangeType aChange) - : mStream(aStream) - , mChange(aChange) - { - } - - NS_IMETHOD Run() - { - nsRefPtr node; - { - // No need to keep holding the lock for the whole duration of this - // function, since we're holding a strong reference to it, so if - // we can obtain the reference, we will hold the node alive in - // this function. - MutexAutoLock lock(mStream->Engine()->NodeMutex()); - node = static_cast(mStream->Engine()->Node()); - } - if (node) { - if (mChange == ADDREF) { - node->mPlayingRef.Take(node); - } else if (mChange == RELEASE) { - node->mPlayingRef.Drop(node); - } - } - return NS_OK; - } - -private: - nsRefPtr mStream; - ChangeType mChange; -}; - -} -} - -#endif -