Index: Source/modules/webaudio/AudioContext.cpp |
diff --git a/Source/modules/webaudio/AudioContext.cpp b/Source/modules/webaudio/AudioContext.cpp |
index 051f27e64a535f85c27f2e32832ddac62fd0863e..82af11acf1b771bae88162aa485405aea041f822 100644 |
--- a/Source/modules/webaudio/AudioContext.cpp |
+++ b/Source/modules/webaudio/AudioContext.cpp |
@@ -191,6 +191,11 @@ void AudioContext::initialize() |
void AudioContext::clear() |
{ |
+#if ENABLE(OILPAN) |
+ // We need to run disposers before destructing m_contextGraphMutex. |
+ m_liveAudioSummingJunctions.clear(); |
+#endif |
+ |
// We have to release our reference to the destination node before the context will ever be deleted since the destination node holds a reference to the context. |
if (m_destinationNode) |
m_destinationNode.clear(); |
@@ -756,6 +761,20 @@ void AudioContext::handleDeferredAudioNodeTasks() |
m_deferredFinishDerefList.clear(); |
} |
+#if ENABLE(OILPAN) |
+void AudioContext::registerLiveAudioSummingJunction(AudioSummingJunction& junction) |
+{ |
+ ASSERT(isMainThread()); |
+ m_liveAudioSummingJunctions.add(&junction, adoptPtr(new AudioSummingJunctionDisposer(junction))); |
+} |
+ |
+AudioContext::AudioSummingJunctionDisposer::~AudioSummingJunctionDisposer() |
+{ |
+ ASSERT(isMainThread()); |
+ m_junction.context()->removeMarkedSummingJunction(&m_junction); |
+} |
+#endif |
+ |
void AudioContext::markForDeletion(AudioNode* node) |
{ |
ASSERT(isGraphOwner()); |
@@ -965,6 +984,9 @@ void AudioContext::trace(Visitor* visitor) |
visitor->trace(m_renderTarget); |
visitor->trace(m_destinationNode); |
visitor->trace(m_listener); |
+#if ENABLE(OILPAN) |
+ visitor->trace(m_liveAudioSummingJunctions); |
+#endif |
EventTargetWithInlineData::trace(visitor); |
} |