Index: Source/modules/webaudio/AudioNode.h |
diff --git a/Source/modules/webaudio/AudioNode.h b/Source/modules/webaudio/AudioNode.h |
index 8bf98958866bcfb454808e36db0afaa9a729f0a6..d2219d6b72fa72104c6bc3f5a9c8c71b0e8c1426 100644 |
--- a/Source/modules/webaudio/AudioNode.h |
+++ b/Source/modules/webaudio/AudioNode.h |
@@ -50,7 +50,7 @@ class ExceptionState; |
// Most processing nodes such as filters will have one input and one output, although multiple inputs and outputs are possible. |
// AudioNode has its own ref-counting mechanism that use RefTypes so we cannot use RefCountedGarbageCollected. |
-class AudioNode : public NoBaseWillBeGarbageCollectedFinalized<AudioNode>, public EventTargetWithInlineData { |
+class AudioNode : public GarbageCollectedFinalized<AudioNode>, public EventTargetWithInlineData { |
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(AudioNode); |
public: |
enum { ProcessingSizeInFrames = 128 }; |
@@ -97,12 +97,6 @@ public: |
String nodeTypeName() const; |
void setNodeType(NodeType); |
-#if !ENABLE(OILPAN) |
- // Can be called from main thread or context's audio thread. |
- void ref(); |
- void deref(); |
-#endif |
- |
// This object has been connected to another object. This might have |
// existing connections from others. |
// This function must be called after acquiring a connection reference. |
@@ -198,7 +192,7 @@ public: |
protected: |
// Inputs and outputs must be created before the AudioNode is initialized. |
void addInput(); |
- void addOutput(PassOwnPtrWillBeRawPtr<AudioNodeOutput>); |
+ void addOutput(AudioNodeOutput*); |
// Called by processIfNecessary() to cause all parts of the rendering graph connected to us to process. |
// Each rendering quantum, the audio data for each of the AudioNode's inputs will be available after this method is called. |
@@ -211,10 +205,10 @@ protected: |
private: |
volatile bool m_isInitialized; |
NodeType m_nodeType; |
- RefPtrWillBeMember<AudioContext> m_context; |
+ Member<AudioContext> m_context; |
float m_sampleRate; |
- WillBeHeapVector<OwnPtrWillBeMember<AudioNodeInput> > m_inputs; |
- WillBeHeapVector<OwnPtrWillBeMember<AudioNodeOutput> > m_outputs; |
+ HeapVector<Member<AudioNodeInput> > m_inputs; |
+ HeapVector<Member<AudioNodeOutput> > m_outputs; |
double m_lastProcessingTime; |
double m_lastNonSilentTime; |
@@ -222,6 +216,16 @@ private: |
#if !ENABLE(OILPAN) |
// Ref-counting |
volatile int m_normalRefCount; |
+ |
+ // AudioNodes are in the oilpan heap but they are still reference counted at |
+ // the same time. This is because we are not allowed to stop the audio |
+ // thread and thus the audio thread cannot allocate objects in the oilpan |
+ // heap. |
+ // The m_keepAlive handle is used to keep a persistent reference to this |
+ // AudioNode while someone has a reference to this AudioNode through a |
+ // RefPtr. |
+ GC_PLUGIN_IGNORE("") |
+ Persistent<AudioNode> m_keepAlive; |
#endif |
volatile int m_connectionRefCount; |
@@ -235,6 +239,10 @@ private: |
static unsigned s_instanceCount; |
#if !ENABLE(OILPAN) |
+ // Can be called from main thread or context's audio thread. |
+ void ref(); |
+ void deref(); |
+ |
virtual void refEventTarget() OVERRIDE FINAL { ref(); } |
virtual void derefEventTarget() OVERRIDE FINAL { deref(); } |
#endif |