Index: Source/modules/webaudio/AudioNode.h |
diff --git a/Source/modules/webaudio/AudioNode.h b/Source/modules/webaudio/AudioNode.h |
index 5ebe221ee62803656bb0fb4e6301e83faf4d0502..631514e263ad2a0753de7acc42be1451b3921a00 100644 |
--- a/Source/modules/webaudio/AudioNode.h |
+++ b/Source/modules/webaudio/AudioNode.h |
@@ -50,7 +50,8 @@ class ExceptionState; |
// An AudioDestinationNode has one input and no outputs and represents the final destination to the audio hardware. |
// Most processing nodes such as filters will have one input and one output, although multiple inputs and outputs are possible. |
-class AudioNode : public ScriptWrappable, public EventTargetWithInlineData { |
+// AudioNode has its own ref-counting mechanism that use RefTypes so we cannot use RefCountedGarbageCollected. |
+class AudioNode : public NoBaseWillBeGarbageCollectedFinalized<AudioNode>, public ScriptWrappable, public EventTargetWithInlineData { |
public: |
enum { ProcessingSizeInFrames = 128 }; |
@@ -179,6 +180,12 @@ public: |
virtual const AtomicString& interfaceName() const OVERRIDE FINAL; |
virtual ExecutionContext* executionContext() const OVERRIDE FINAL; |
+ virtual void trace(Visitor*); |
+ |
+#if ENABLE(OILPAN) |
+ void clearKeepAlive(); |
+#endif |
+ |
protected: |
// Inputs and outputs must be created before the AudioNode is initialized. |
void addInput(PassOwnPtr<AudioNodeInput>); |
@@ -195,11 +202,23 @@ protected: |
private: |
volatile bool m_isInitialized; |
NodeType m_nodeType; |
- RefPtr<AudioContext> m_context; |
+ RefPtrWillBeMember<AudioContext> m_context; |
float m_sampleRate; |
Vector<OwnPtr<AudioNodeInput> > m_inputs; |
Vector<OwnPtr<AudioNodeOutput> > m_outputs; |
+#if ENABLE(OILPAN) |
+ // 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("http://crbug.com/353083") |
+ OwnPtr<Persistent<AudioNode> > m_keepAlive; |
+#endif |
+ |
double m_lastProcessingTime; |
double m_lastNonSilentTime; |