Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(111)

Unified Diff: Source/WebCore/webaudio/AudioContext.h

Issue 7749016: Merge 92658 - Fix thread-safety of AudioNode deletion (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/835/
Patch Set: Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | Source/WebCore/webaudio/AudioContext.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/WebCore/webaudio/AudioContext.h
===================================================================
--- Source/WebCore/webaudio/AudioContext.h (revision 93817)
+++ Source/WebCore/webaudio/AudioContext.h (working copy)
@@ -37,6 +37,7 @@
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
+#include <wtf/ThreadSafeRefCounted.h>
#include <wtf/Threading.h>
#include <wtf/Vector.h>
#include <wtf/text/AtomicStringHash.h>
@@ -66,7 +67,7 @@
// AudioContext is the cornerstone of the web audio API and all AudioNodes are created from it.
// For thread safety between the audio thread and the main thread, it has a rendering graph locking mechanism.
-class AudioContext : public ActiveDOMObject, public RefCounted<AudioContext>, public EventTarget {
+class AudioContext : public ActiveDOMObject, public ThreadSafeRefCounted<AudioContext>, public EventTarget {
public:
// Create an AudioContext for rendering to the audio hardware.
static PassRefPtr<AudioContext> create(Document*);
@@ -135,10 +136,10 @@
// Called periodically at the end of each render quantum to dereference finished source nodes.
void derefFinishedSourceNodes();
- // We reap all marked nodes at the end of each realtime render quantum in deleteMarkedNodes().
+ // We schedule deletion of all marked nodes at the end of each realtime render quantum.
void markForDeletion(AudioNode*);
void deleteMarkedNodes();
-
+
// Keeps track of the number of connections made.
void incrementConnectionCount()
{
@@ -208,9 +209,9 @@
DEFINE_ATTRIBUTE_EVENT_LISTENER(complete);
- // Reconcile ref/deref which are defined both in AudioNode and EventTarget.
- using RefCounted<AudioContext>::ref;
- using RefCounted<AudioContext>::deref;
+ // Reconcile ref/deref which are defined both in ThreadSafeRefCounted and EventTarget.
+ using ThreadSafeRefCounted<AudioContext>::ref;
+ using ThreadSafeRefCounted<AudioContext>::deref;
void startRendering();
void fireCompletionEvent();
@@ -224,6 +225,9 @@
void lazyInitialize();
void uninitialize();
+
+ void scheduleNodeDeletion();
+ static void deleteMarkedNodesDispatch(void* userData);
bool m_isInitialized;
bool m_isAudioThreadFinished;
@@ -256,8 +260,10 @@
// Either accessed when the graph lock is held, or on the main thread when the audio thread has finished.
Vector<AudioNode*> m_referencedNodes;
- // Accumulate nodes which need to be deleted at the end of a render cycle (in realtime thread) here.
+ // Accumulate nodes which need to be deleted here.
+ // They will be scheduled for deletion (on the main thread) at the end of a render cycle (in realtime thread).
Vector<AudioNode*> m_nodesToDelete;
+ bool m_isDeletionScheduled;
// Only accessed when the graph lock is held.
HashSet<AudioNodeInput*> m_dirtyAudioNodeInputs;
« no previous file with comments | « no previous file | Source/WebCore/webaudio/AudioContext.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698