mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-20 00:35:44 +00:00
Bug 1560215 - Accomodate extra async step added by RunOnGraph. r=padenot
It leads to a race with MediaRecorder::Session::Shutdown where the RunOnGraph runner was dispatched to the graph before, but tries to dispatch to the encoder thread after, the encoder thread had BeginShutdown() called on it. Allowing the encoder thread dispatch to fail in this case is reasonable and safe. Depends on D36508 Differential Revision: https://phabricator.services.mozilla.com/D36509 --HG-- extra : moz-landing-system : lando
This commit is contained in:
parent
961162ffd8
commit
2bfda55f1e
@ -457,41 +457,42 @@ void MediaEncoder::RunOnGraph(already_AddRefed<Runnable> aRunnable) {
|
||||
|
||||
void MediaEncoder::Suspend() {
|
||||
RunOnGraph(NS_NewRunnableFunction(
|
||||
"MediaEncoder::Suspend",
|
||||
"MediaEncoder::Suspend (graph)",
|
||||
[thread = mEncoderThread, audio = mAudioEncoder, video = mVideoEncoder] {
|
||||
if (audio) {
|
||||
nsresult rv = thread->Dispatch(
|
||||
NewRunnableMethod("AudioTrackEncoder::Suspend", audio,
|
||||
&AudioTrackEncoder::Suspend));
|
||||
MOZ_DIAGNOSTIC_ASSERT(NS_SUCCEEDED(rv));
|
||||
Unused << rv;
|
||||
}
|
||||
if (video) {
|
||||
nsresult rv = thread->Dispatch(NewRunnableMethod<TimeStamp>(
|
||||
"VideoTrackEncoder::Suspend", video, &VideoTrackEncoder::Suspend,
|
||||
TimeStamp::Now()));
|
||||
MOZ_DIAGNOSTIC_ASSERT(NS_SUCCEEDED(rv));
|
||||
Unused << rv;
|
||||
if (NS_FAILED(thread->Dispatch(
|
||||
NS_NewRunnableFunction("MediaEncoder::Suspend (encoder)",
|
||||
[audio, video, now = TimeStamp::Now()] {
|
||||
if (audio) {
|
||||
audio->Suspend();
|
||||
}
|
||||
if (video) {
|
||||
video->Suspend(now);
|
||||
}
|
||||
})))) {
|
||||
// RunOnGraph added an extra async step, and now `thread` has shut
|
||||
// down.
|
||||
return;
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
void MediaEncoder::Resume() {
|
||||
RunOnGraph(NS_NewRunnableFunction(
|
||||
"MediaEncoder::Resume",
|
||||
"MediaEncoder::Resume (graph)",
|
||||
[thread = mEncoderThread, audio = mAudioEncoder, video = mVideoEncoder] {
|
||||
if (audio) {
|
||||
nsresult rv = thread->Dispatch(NewRunnableMethod(
|
||||
"AudioTrackEncoder::Resume", audio, &AudioTrackEncoder::Resume));
|
||||
MOZ_DIAGNOSTIC_ASSERT(NS_SUCCEEDED(rv));
|
||||
Unused << rv;
|
||||
}
|
||||
if (video) {
|
||||
nsresult rv = thread->Dispatch(NewRunnableMethod<TimeStamp>(
|
||||
"VideoTrackEncoder::Resume", video, &VideoTrackEncoder::Resume,
|
||||
TimeStamp::Now()));
|
||||
MOZ_DIAGNOSTIC_ASSERT(NS_SUCCEEDED(rv));
|
||||
Unused << rv;
|
||||
if (NS_FAILED(thread->Dispatch(
|
||||
NS_NewRunnableFunction("MediaEncoder::Resume (encoder)",
|
||||
[audio, video, now = TimeStamp::Now()] {
|
||||
if (audio) {
|
||||
audio->Resume();
|
||||
}
|
||||
if (video) {
|
||||
video->Resume(now);
|
||||
}
|
||||
})))) {
|
||||
// RunOnGraph added an extra async step, and now `thread` has shut
|
||||
// down.
|
||||
return;
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user