/
audiocontext_haspendingactivity_unless_it_s_closed.patch
47 lines (40 loc) · 2.4 KB
/
audiocontext_haspendingactivity_unless_it_s_closed.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Raymond Toy <rtoy@chromium.org>
Date: Mon, 16 Dec 2019 17:06:28 +0000
Subject: AudioContext HasPendingActivity unless it's closed
An AudioContext is considered to have activity if it's not closed.
Previously, suspended contexts were considered has having no activity,
but that's not quite true since the context can be resumed at any time
after. This would allow contexts to be collected prematurely even
though the context was resumed. This causes the audio thread to
access objects that are possibly deleted.
Manually tested against test case from the bug; no issues seen.
TBR=hongchan@chromium.org
(cherry picked from commit 5efc951230de524c2b6787e25ec651c46f2652b4)
Bug: 1023810
Change-Id: I81cc0aff57bf4701b3ef9c36dd72b7e8922af5b9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1955339
Reviewed-by: Hongchan Choi <hongchan@chromium.org>
Commit-Queue: Raymond Toy <rtoy@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#724364}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1969044
Reviewed-by: Raymond Toy <rtoy@chromium.org>
Cr-Commit-Position: refs/branch-heads/3987@{#158}
Cr-Branched-From: c4e8da9871cc266be74481e212f3a5252972509d-refs/heads/master@{#722274}
diff --git a/third_party/blink/renderer/modules/webaudio/audio_context.cc b/third_party/blink/renderer/modules/webaudio/audio_context.cc
index 839d8c83973b979a3382464a05c2368eec8a7bae..990fe75f1ddd4ebf9a526a9e416d2ee865afca86 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_context.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_context.cc
@@ -545,9 +545,11 @@ void AudioContext::ContextDestroyed(ExecutionContext*) {
}
bool AudioContext::HasPendingActivity() const {
- // There's activity only if the context is running. Suspended contexts are
- // basically idle with nothing going on.
- return (ContextState() == kRunning) && BaseAudioContext::HasPendingActivity();
+ // There's activity if the context is is not closed. Suspended contexts count
+ // as having activity even though they are basically idle with nothing going
+ // on. However, the can be resumed at any time, so we don't want contexts
+ // going away prematurely.
+ return (ContextState() != kClosed) && BaseAudioContext::HasPendingActivity();
}
bool AudioContext::HandlePreRenderTasks(const AudioIOPosition* output_position,