Commit bb9b04fe authored by sigbjornf's avatar sigbjornf Committed by Commit bot

Pull AudioDestinationConsumer off the Blink GC heap.

The AudioDestinationConsumer interface and its single implementation
does not meet the bar for being on the Blink GC heap. It doesn't cause
harm to have them there, but in order to diagnose an unexplained
failure, pull these objects off the heap.

We may want to restore them to the Blink GC heap once the issue has
been resolved.

R=
BUG=682945

Review-Url: https://codereview.chromium.org/2748133003
Cr-Commit-Position: refs/heads/master@{#456736}
parent 09165f0b
...@@ -31,20 +31,17 @@ ...@@ -31,20 +31,17 @@
#ifndef AudioDestinationConsumer_h #ifndef AudioDestinationConsumer_h
#define AudioDestinationConsumer_h #define AudioDestinationConsumer_h
#include <memory>
#include "platform/PlatformExport.h" #include "platform/PlatformExport.h"
#include "platform/heap/Handle.h"
namespace blink { namespace blink {
class AudioBus; class AudioBus;
class PLATFORM_EXPORT AudioDestinationConsumer class PLATFORM_EXPORT AudioDestinationConsumer {
: public GarbageCollected<AudioDestinationConsumer> {
public: public:
virtual void setFormat(size_t numberOfChannels, float sampleRate) = 0; virtual void setFormat(size_t numberOfChannels, float sampleRate) = 0;
virtual void consumeAudio(AudioBus*, size_t numberOfFrames) = 0; virtual void consumeAudio(AudioBus*, size_t numberOfFrames) = 0;
DEFINE_INLINE_VIRTUAL_TRACE() {}
}; };
} // namespace blink } // namespace blink
......
...@@ -148,6 +148,8 @@ bool WebMediaStreamSource::requiresAudioConsumer() const { ...@@ -148,6 +148,8 @@ bool WebMediaStreamSource::requiresAudioConsumer() const {
} }
class ConsumerWrapper final : public AudioDestinationConsumer { class ConsumerWrapper final : public AudioDestinationConsumer {
USING_FAST_MALLOC(ConsumerWrapper);
public: public:
static ConsumerWrapper* create(WebAudioDestinationConsumer* consumer) { static ConsumerWrapper* create(WebAudioDestinationConsumer* consumer) {
return new ConsumerWrapper(consumer); return new ConsumerWrapper(consumer);
...@@ -196,12 +198,10 @@ bool WebMediaStreamSource::removeAudioConsumer( ...@@ -196,12 +198,10 @@ bool WebMediaStreamSource::removeAudioConsumer(
ASSERT(isMainThread()); ASSERT(isMainThread());
ASSERT(!m_private.isNull() && consumer); ASSERT(!m_private.isNull() && consumer);
const HeapHashSet<Member<AudioDestinationConsumer>>& consumers = const HashSet<AudioDestinationConsumer*>& consumers =
m_private->audioConsumers(); m_private->audioConsumers();
for (HeapHashSet<Member<AudioDestinationConsumer>>::const_iterator it = for (AudioDestinationConsumer* it : consumers) {
consumers.begin(); ConsumerWrapper* wrapper = static_cast<ConsumerWrapper*>(it);
it != consumers.end(); ++it) {
ConsumerWrapper* wrapper = static_cast<ConsumerWrapper*>(it->get());
if (wrapper->consumer() == consumer) { if (wrapper->consumer() == consumer) {
m_private->removeAudioConsumer(wrapper); m_private->removeAudioConsumer(wrapper);
return true; return true;
......
...@@ -85,8 +85,7 @@ bool MediaStreamSource::removeAudioConsumer( ...@@ -85,8 +85,7 @@ bool MediaStreamSource::removeAudioConsumer(
AudioDestinationConsumer* consumer) { AudioDestinationConsumer* consumer) {
ASSERT(m_requiresConsumer); ASSERT(m_requiresConsumer);
MutexLocker locker(m_audioConsumersLock); MutexLocker locker(m_audioConsumersLock);
HeapHashSet<Member<AudioDestinationConsumer>>::iterator it = auto it = m_audioConsumers.find(consumer);
m_audioConsumers.find(consumer);
if (it == m_audioConsumers.end()) if (it == m_audioConsumers.end())
return false; return false;
m_audioConsumers.erase(it); m_audioConsumers.erase(it);
...@@ -101,24 +100,19 @@ void MediaStreamSource::setAudioFormat(size_t numberOfChannels, ...@@ -101,24 +100,19 @@ void MediaStreamSource::setAudioFormat(size_t numberOfChannels,
float sampleRate) { float sampleRate) {
ASSERT(m_requiresConsumer); ASSERT(m_requiresConsumer);
MutexLocker locker(m_audioConsumersLock); MutexLocker locker(m_audioConsumersLock);
for (HeapHashSet<Member<AudioDestinationConsumer>>::iterator it = for (AudioDestinationConsumer* consumer : m_audioConsumers)
m_audioConsumers.begin(); consumer->setFormat(numberOfChannels, sampleRate);
it != m_audioConsumers.end(); ++it)
(*it)->setFormat(numberOfChannels, sampleRate);
} }
void MediaStreamSource::consumeAudio(AudioBus* bus, size_t numberOfFrames) { void MediaStreamSource::consumeAudio(AudioBus* bus, size_t numberOfFrames) {
ASSERT(m_requiresConsumer); ASSERT(m_requiresConsumer);
MutexLocker locker(m_audioConsumersLock); MutexLocker locker(m_audioConsumersLock);
for (HeapHashSet<Member<AudioDestinationConsumer>>::iterator it = for (AudioDestinationConsumer* consumer : m_audioConsumers)
m_audioConsumers.begin(); consumer->consumeAudio(bus, numberOfFrames);
it != m_audioConsumers.end(); ++it)
(*it)->consumeAudio(bus, numberOfFrames);
} }
DEFINE_TRACE(MediaStreamSource) { DEFINE_TRACE(MediaStreamSource) {
visitor->trace(m_observers); visitor->trace(m_observers);
visitor->trace(m_audioConsumers);
} }
} // namespace blink } // namespace blink
...@@ -102,7 +102,7 @@ class PLATFORM_EXPORT MediaStreamSource final ...@@ -102,7 +102,7 @@ class PLATFORM_EXPORT MediaStreamSource final
bool requiresAudioConsumer() const { return m_requiresConsumer; } bool requiresAudioConsumer() const { return m_requiresConsumer; }
void addAudioConsumer(AudioDestinationConsumer*); void addAudioConsumer(AudioDestinationConsumer*);
bool removeAudioConsumer(AudioDestinationConsumer*); bool removeAudioConsumer(AudioDestinationConsumer*);
const HeapHashSet<Member<AudioDestinationConsumer>>& audioConsumers() { const HashSet<AudioDestinationConsumer*>& audioConsumers() {
return m_audioConsumers; return m_audioConsumers;
} }
...@@ -126,7 +126,7 @@ class PLATFORM_EXPORT MediaStreamSource final ...@@ -126,7 +126,7 @@ class PLATFORM_EXPORT MediaStreamSource final
bool m_requiresConsumer; bool m_requiresConsumer;
HeapHashSet<WeakMember<Observer>> m_observers; HeapHashSet<WeakMember<Observer>> m_observers;
Mutex m_audioConsumersLock; Mutex m_audioConsumersLock;
HeapHashSet<Member<AudioDestinationConsumer>> m_audioConsumers; HashSet<AudioDestinationConsumer*> m_audioConsumers;
std::unique_ptr<ExtraData> m_extraData; std::unique_ptr<ExtraData> m_extraData;
WebMediaConstraints m_constraints; WebMediaConstraints m_constraints;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment