[WebAudio] Call AudioContext::uninitialize() immediately when the AudioContext is...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 18 Jan 2019 13:46:29 +0000 (13:46 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 18 Jan 2019 13:46:29 +0000 (13:46 +0000)
https://bugs.webkit.org/show_bug.cgi?id=192586

Patch by Yacine Bandou <yacine.bandou@softathome.com> on 2019-01-18
Reviewed by Philippe Normand.

When WebProcess is killed, AudioContext::uninitialize() is not called immediately in the stop so
the AudioDestinationNode is not destroyed.

In my case, I have a resource device manager, the output audio device is reserved when AudioDestinationNode
is instantiated and it is released when AudioDestinationNode is destroyed, thus when the webprocess is killed,
the resources leak.

AudioContext::uninitialize() is not called immediately since r94608.
This modification can now be reverted without regression in WebAudio tests.

Test: webaudio/mediaelementaudiosourcenode-gc.html

* Modules/webaudio/AudioContext.cpp:
(WebCore::AudioContext::stop):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@240142 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/Modules/webaudio/AudioContext.cpp

index 7223fc5..a103b7f 100644 (file)
@@ -1,3 +1,25 @@
+2019-01-18  Yacine Bandou  <yacine.bandou@softathome.com>
+
+        [WebAudio] Call AudioContext::uninitialize() immediately when the AudioContext is stopped
+        https://bugs.webkit.org/show_bug.cgi?id=192586
+
+        Reviewed by Philippe Normand.
+
+        When WebProcess is killed, AudioContext::uninitialize() is not called immediately in the stop so
+        the AudioDestinationNode is not destroyed.
+
+        In my case, I have a resource device manager, the output audio device is reserved when AudioDestinationNode
+        is instantiated and it is released when AudioDestinationNode is destroyed, thus when the webprocess is killed,
+        the resources leak.
+
+        AudioContext::uninitialize() is not called immediately since r94608.
+        This modification can now be reverted without regression in WebAudio tests.
+
+        Test: webaudio/mediaelementaudiosourcenode-gc.html
+
+        * Modules/webaudio/AudioContext.cpp:
+        (WebCore::AudioContext::stop):
+
 2019-01-18  Simon Fraser  <simon.fraser@apple.com>
 
         ScrollingCoordinator::scrollableAreaScrollLayerDidChange() can be removed
index c54282f..d940dc0 100644 (file)
@@ -314,16 +314,8 @@ void AudioContext::stop()
 
     m_eventQueue->close();
 
-    // Don't call uninitialize() immediately here because the ScriptExecutionContext is in the middle
-    // of dealing with all of its ActiveDOMObjects at this point. uninitialize() can de-reference other
-    // ActiveDOMObjects so let's schedule uninitialize() to be called later.
-    // FIXME: see if there's a more direct way to handle this issue.
-    // FIXME: This sounds very wrong. The whole idea of stop() is that it stops everything, and if we
-    // schedule some observable work for later, the work likely happens at an inappropriate time.
-    callOnMainThread([this] {
-        uninitialize();
-        clear();
-    });
+    uninitialize();
+    clear();
 }
 
 bool AudioContext::canSuspendForDocumentSuspension() const