From 7c0050f3a5959f9581d679df68b0d3352dd92d31 Mon Sep 17 00:00:00 2001 From: Andrew Osmond Date: Tue, 19 Nov 2024 02:31:01 +0000 Subject: [PATCH] Bug 1684991 - Start the RDD process early. r=media-playback-reviewers,alwu This patch makes it so that we launch the RDD process relatively early in the Firefox startup. This will improve the latency when we began playback for the first video. Differential Revision: https://phabricator.services.mozilla.com/D229427 --- dom/base/nsDOMWindowUtils.cpp | 13 +++++++++++++ dom/interfaces/base/nsIDOMWindowUtils.idl | 5 +++++ dom/ipc/ContentParent.cpp | 7 +++++++ .../aboutmemory/tests/test_aboutmemory5.xhtml | 7 ++++++- .../aboutmemory/tests/test_aboutmemory7.xhtml | 2 +- .../aboutmemory/tests/test_memoryReporters.xhtml | 6 +++++- .../aboutmemory/tests/test_memoryReporters2.xhtml | 7 ++++++- 7 files changed, 43 insertions(+), 4 deletions(-) diff --git a/dom/base/nsDOMWindowUtils.cpp b/dom/base/nsDOMWindowUtils.cpp index 39b44dd8a3a2f..aae46b9bd2e77 100644 --- a/dom/base/nsDOMWindowUtils.cpp +++ b/dom/base/nsDOMWindowUtils.cpp @@ -116,6 +116,7 @@ #include "mozilla/layers/IAPZCTreeManager.h" // for layers::ZoomToRectBehavior #include "mozilla/dom/Document.h" #include "mozilla/dom/Promise.h" +#include "mozilla/RDDProcessManager.h" #include "mozilla/ServoBindings.h" #include "mozilla/StyleSheetInlines.h" #include "mozilla/gfx/gfxVars.h" @@ -4380,6 +4381,18 @@ nsDOMWindowUtils::GetGpuProcessPid(int32_t* aPid) { return NS_OK; } +NS_IMETHODIMP +nsDOMWindowUtils::GetRddProcessPid(int32_t* aPid) { + RDDProcessManager* pm = RDDProcessManager::Get(); + if (pm) { + *aPid = pm->RDDProcessPid(); + } else { + *aPid = -1; + } + + return NS_OK; +} + struct StateTableEntry { const char* mStateString; ElementState mState; diff --git a/dom/interfaces/base/nsIDOMWindowUtils.idl b/dom/interfaces/base/nsIDOMWindowUtils.idl index 7f87e544c37c6..b4d065ff31974 100644 --- a/dom/interfaces/base/nsIDOMWindowUtils.idl +++ b/dom/interfaces/base/nsIDOMWindowUtils.idl @@ -2129,6 +2129,11 @@ interface nsIDOMWindowUtils : nsISupports { */ readonly attribute int32_t gpuProcessPid; + /** + * Returns the RDD process pid, or -1 if there is no RDD process. + */ + readonly attribute int32_t rddProcessPid; + /** * Returns usage data for a given storage object. * diff --git a/dom/ipc/ContentParent.cpp b/dom/ipc/ContentParent.cpp index 05ecd3925bdf8..fdab0349abdd8 100644 --- a/dom/ipc/ContentParent.cpp +++ b/dom/ipc/ContentParent.cpp @@ -68,6 +68,7 @@ #include "mozilla/ProfilerLabels.h" #include "mozilla/ProfilerMarkers.h" #include "mozilla/RecursiveMutex.h" +#include "mozilla/RDDProcessManager.h" #include "mozilla/ScopeExit.h" #include "mozilla/ScriptPreloader.h" #include "mozilla/Components.h" @@ -2964,6 +2965,12 @@ bool ContentParent::InitInternal(ProcessPriority aInitialPriority) { gpm->AddListener(this); + if (StaticPrefs::media_rdd_process_enabled()) { + // Ensure the RDD process has been started. + RDDProcessManager* rdd = RDDProcessManager::Get(); + rdd->LaunchRDDProcess(); + } + nsStyleSheetService* sheetService = nsStyleSheetService::GetInstance(); if (sheetService) { // This looks like a lot of work, but in a normal browser session we just diff --git a/toolkit/components/aboutmemory/tests/test_aboutmemory5.xhtml b/toolkit/components/aboutmemory/tests/test_aboutmemory5.xhtml index 7b63179767602..445aadc27bb87 100644 --- a/toolkit/components/aboutmemory/tests/test_aboutmemory5.xhtml +++ b/toolkit/components/aboutmemory/tests/test_aboutmemory5.xhtml @@ -132,7 +132,12 @@ socketProcessRunning = 1; } - let m2 = (vsizes.length == (4 + socketProcessRunning + ChromeUtils.aliveUtilityProcesses) && + let rddProcessRunning = 0; + if (window.windowUtils.rddProcessPid != -1) { + rddProcessRunning = 1; + } + + let m2 = (vsizes.length == (4 + socketProcessRunning + rddProcessRunning + ChromeUtils.aliveUtilityProcesses) && endOfBrowsers.length == 3); ok(m2, "three content processes present in loaded data"); good = good && !!m2; diff --git a/toolkit/components/aboutmemory/tests/test_aboutmemory7.xhtml b/toolkit/components/aboutmemory/tests/test_aboutmemory7.xhtml index a31eb6e6b4c3c..12e9538106c6a 100644 --- a/toolkit/components/aboutmemory/tests/test_aboutmemory7.xhtml +++ b/toolkit/components/aboutmemory/tests/test_aboutmemory7.xhtml @@ -105,7 +105,7 @@ SimpleTest.waitForClipboard( function(aActual) { mostRecentActual = aActual; - let rslt = aActual.trim() === aExpected.trim(); + let rslt = aActual.trim().startsWith(aExpected.trim()); if (!rslt) { // Try copying again. synthesizeKey("A", {accelKey: true}); diff --git a/toolkit/components/aboutmemory/tests/test_memoryReporters.xhtml b/toolkit/components/aboutmemory/tests/test_memoryReporters.xhtml index 47c9c139a6b26..3bcc57539836e 100644 --- a/toolkit/components/aboutmemory/tests/test_memoryReporters.xhtml +++ b/toolkit/components/aboutmemory/tests/test_memoryReporters.xhtml @@ -237,7 +237,11 @@ if (SpecialPowers.Services.io.socketProcessLaunched) { socketProcessRunning = 1; } - is(aAmounts.length, 1 + socketProcessRunning, + let rddProcessRunning = 0; + if (window.windowUtils.rddProcessPid != -1) { + rddProcessRunning = 1; + } + is(aAmounts.length, 1 + socketProcessRunning + rddProcessRunning, aName + " has " + aAmounts.length + " report"); let n = aAmounts[0]; if (!aCanBeUnreasonable) { diff --git a/toolkit/components/aboutmemory/tests/test_memoryReporters2.xhtml b/toolkit/components/aboutmemory/tests/test_memoryReporters2.xhtml index 8dc7567109580..d22ebc1a381af 100644 --- a/toolkit/components/aboutmemory/tests/test_memoryReporters2.xhtml +++ b/toolkit/components/aboutmemory/tests/test_memoryReporters2.xhtml @@ -21,8 +21,12 @@ if (SpecialPowers.Services.io.socketProcessLaunched) { socketProcessRunning = 1; } + let rddProcessRunning = 0; + if (window.windowUtils.rddProcessPid != -1) { + rddProcessRunning = 1; + } let numToOpen = 3; - const expectedNumRemotes = numToOpen + socketProcessRunning; + const expectedNumRemotes = numToOpen + socketProcessRunning + rddProcessRunning; let numReady = 0; // Create some remote processes, and set up message-passing so that @@ -96,6 +100,7 @@ } else { ok(processes[i].startsWith("Browser (") || processes[i].startsWith("Web Content (") || (processes[i].startsWith("Socket (") && socketProcessRunning) + || (processes[i].startsWith("RDD (") && rddProcessRunning) || processes[i].startsWith("web (") || processes[i].startsWith("Utility ("), "correct non-empty process name prefix: " + processes[i]); numNonEmptyProcesses++;