Commit 937ebc1a authored by sigbjornf's avatar sigbjornf Committed by Commit bot

Revert "Pull AudioDestinationConsumer off the Blink GC heap."

This reverts commit bb9b04fe,
attempting to diagnose root crash cause.

R=rtoy,haraken
BUG=682945

Review-Url: https://codereview.chromium.org/2757883002
Cr-Commit-Position: refs/heads/master@{#457833}
parent eec95121
......@@ -31,17 +31,20 @@
#ifndef AudioDestinationConsumer_h
#define AudioDestinationConsumer_h
#include <memory>
#include "platform/PlatformExport.h"
#include "platform/heap/Handle.h"
namespace blink {
class AudioBus;
class PLATFORM_EXPORT AudioDestinationConsumer {
class PLATFORM_EXPORT AudioDestinationConsumer
: public GarbageCollected<AudioDestinationConsumer> {
public:
virtual void setFormat(size_t numberOfChannels, float sampleRate) = 0;
virtual void consumeAudio(AudioBus*, size_t numberOfFrames) = 0;
DEFINE_INLINE_VIRTUAL_TRACE() {}
};
} // namespace blink
......
......@@ -148,8 +148,6 @@ bool WebMediaStreamSource::requiresAudioConsumer() const {
}
class ConsumerWrapper final : public AudioDestinationConsumer {
USING_FAST_MALLOC(ConsumerWrapper);
public:
static ConsumerWrapper* create(WebAudioDestinationConsumer* consumer) {
return new ConsumerWrapper(consumer);
......@@ -198,10 +196,12 @@ bool WebMediaStreamSource::removeAudioConsumer(
ASSERT(isMainThread());
ASSERT(!m_private.isNull() && consumer);
const HashSet<AudioDestinationConsumer*>& consumers =
const HeapHashSet<Member<AudioDestinationConsumer>>& consumers =
m_private->audioConsumers();
for (AudioDestinationConsumer* it : consumers) {
ConsumerWrapper* wrapper = static_cast<ConsumerWrapper*>(it);
for (HeapHashSet<Member<AudioDestinationConsumer>>::const_iterator it =
consumers.begin();
it != consumers.end(); ++it) {
ConsumerWrapper* wrapper = static_cast<ConsumerWrapper*>(it->get());
if (wrapper->consumer() == consumer) {
m_private->removeAudioConsumer(wrapper);
return true;
......
......@@ -85,7 +85,8 @@ bool MediaStreamSource::removeAudioConsumer(
AudioDestinationConsumer* consumer) {
ASSERT(m_requiresConsumer);
MutexLocker locker(m_audioConsumersLock);
auto it = m_audioConsumers.find(consumer);
HeapHashSet<Member<AudioDestinationConsumer>>::iterator it =
m_audioConsumers.find(consumer);
if (it == m_audioConsumers.end())
return false;
m_audioConsumers.erase(it);
......@@ -100,8 +101,10 @@ void MediaStreamSource::setAudioFormat(size_t numberOfChannels,
float sampleRate) {
ASSERT(m_requiresConsumer);
MutexLocker locker(m_audioConsumersLock);
for (AudioDestinationConsumer* consumer : m_audioConsumers)
consumer->setFormat(numberOfChannels, sampleRate);
for (HeapHashSet<Member<AudioDestinationConsumer>>::iterator it =
m_audioConsumers.begin();
it != m_audioConsumers.end(); ++it)
(*it)->setFormat(numberOfChannels, sampleRate);
}
void MediaStreamSource::consumeAudio(AudioBus* bus, size_t numberOfFrames) {
......@@ -110,12 +113,15 @@ void MediaStreamSource::consumeAudio(AudioBus* bus, size_t numberOfFrames) {
// Prevent GCs from going ahead while this iteration runs, attempting to
// pinpoint crbug.com/682945 failures.
ThreadState::MainThreadGCForbiddenScope scope;
for (AudioDestinationConsumer* consumer : m_audioConsumers)
consumer->consumeAudio(bus, numberOfFrames);
for (HeapHashSet<Member<AudioDestinationConsumer>>::iterator it =
m_audioConsumers.begin();
it != m_audioConsumers.end(); ++it)
(*it)->consumeAudio(bus, numberOfFrames);
}
DEFINE_TRACE(MediaStreamSource) {
visitor->trace(m_observers);
visitor->trace(m_audioConsumers);
}
} // namespace blink
......@@ -102,7 +102,7 @@ class PLATFORM_EXPORT MediaStreamSource final
bool requiresAudioConsumer() const { return m_requiresConsumer; }
void addAudioConsumer(AudioDestinationConsumer*);
bool removeAudioConsumer(AudioDestinationConsumer*);
const HashSet<AudioDestinationConsumer*>& audioConsumers() {
const HeapHashSet<Member<AudioDestinationConsumer>>& audioConsumers() {
return m_audioConsumers;
}
......@@ -126,7 +126,7 @@ class PLATFORM_EXPORT MediaStreamSource final
bool m_requiresConsumer;
HeapHashSet<WeakMember<Observer>> m_observers;
Mutex m_audioConsumersLock;
HashSet<AudioDestinationConsumer*> m_audioConsumers;
HeapHashSet<Member<AudioDestinationConsumer>> m_audioConsumers;
std::unique_ptr<ExtraData> m_extraData;
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