From f996a9241f4bf443492e760d4d7a0051bbf0e831 Mon Sep 17 00:00:00 2001 From: Paul Adenot Date: Tue, 17 Sep 2024 14:09:05 +0000 Subject: [PATCH] Bug 1918506 - Align stack sizes for AudioWorkletProcessor. r=karlt Differential Revision: https://phabricator.services.mozilla.com/D222084 --- dom/media/GraphRunner.cpp | 7 +++++-- .../audioworkletprocessor-recursion.html | 21 +++++++++++++++++++ dom/media/test/crashtests/crashtests.list | 1 + dom/worklet/WorkletThread.cpp | 2 ++ dom/worklet/WorkletThread.h | 4 ++++ 5 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 dom/media/test/crashtests/audioworkletprocessor-recursion.html diff --git a/dom/media/GraphRunner.cpp b/dom/media/GraphRunner.cpp index 7ca4bb7a6420..28fe53815798 100644 --- a/dom/media/GraphRunner.cpp +++ b/dom/media/GraphRunner.cpp @@ -13,6 +13,7 @@ #include "nsISupportsPriority.h" #include "prthread.h" #include "Tracing.h" +#include "mozilla/dom/WorkletThread.h" #include "audio_thread_priority.h" #ifdef MOZ_WIDGET_ANDROID # include "AndroidProcess.h" @@ -37,8 +38,10 @@ GraphRunner::~GraphRunner() { /* static */ already_AddRefed GraphRunner::Create(MediaTrackGraphImpl* aGraph) { nsCOMPtr thread; - if (NS_WARN_IF(NS_FAILED( - NS_NewNamedThread("GraphRunner", getter_AddRefs(thread))))) { + nsIThreadManager::ThreadCreationOptions options = { + .stackSize = mozilla::dom::WorkletThread::StackSize()}; + if (NS_WARN_IF(NS_FAILED(NS_NewNamedThread( + "GraphRunner", getter_AddRefs(thread), nullptr, options)))) { return nullptr; } nsCOMPtr supportsPriority = do_QueryInterface(thread); diff --git a/dom/media/test/crashtests/audioworkletprocessor-recursion.html b/dom/media/test/crashtests/audioworkletprocessor-recursion.html new file mode 100644 index 000000000000..eeb86856aca1 --- /dev/null +++ b/dom/media/test/crashtests/audioworkletprocessor-recursion.html @@ -0,0 +1,21 @@ + + + + + diff --git a/dom/media/test/crashtests/crashtests.list b/dom/media/test/crashtests/crashtests.list index e7f700c5341b..02213af604e8 100644 --- a/dom/media/test/crashtests/crashtests.list +++ b/dom/media/test/crashtests/crashtests.list @@ -183,3 +183,4 @@ load vp9cake_corrupt.webm load 1903669.html load 1905234.html load 1905231.webm +skip-if(Android) load audioworkletprocessor-recursion.html diff --git a/dom/worklet/WorkletThread.cpp b/dom/worklet/WorkletThread.cpp index fd42c7a91182..65e05fa47bc2 100644 --- a/dom/worklet/WorkletThread.cpp +++ b/dom/worklet/WorkletThread.cpp @@ -423,6 +423,8 @@ void WorkletThread::Terminate() { DispatchRunnable(runnable.forget()); } +uint32_t WorkletThread::StackSize() { return kWorkletStackSize; } + void WorkletThread::TerminateInternal() { MOZ_ASSERT(!CycleCollectedJSContext::Get() || IsOnWorkletThread()); diff --git a/dom/worklet/WorkletThread.h b/dom/worklet/WorkletThread.h index e6d0e414dced..10ec4b717473 100644 --- a/dom/worklet/WorkletThread.h +++ b/dom/worklet/WorkletThread.h @@ -45,6 +45,10 @@ class WorkletThread final : public nsThread, public nsIObserver { void Terminate(); + // Recommended native stack size to use, greater than the stack size + // internally used by SpiderMonkey. + static uint32_t StackSize(); + private: explicit WorkletThread(WorkletImpl* aWorkletImpl); ~WorkletThread();