From a838c2c75f4ac1fa642c382d9c897ca91470c5c9 Mon Sep 17 00:00:00 2001 From: Nika Layzell Date: Wed, 19 Apr 2023 22:10:08 +0000 Subject: [PATCH] Bug 1824465 - Part 6: Make PRDD refcounted, r=ipc-reviewers,mccr8 Differential Revision: https://phabricator.services.mozilla.com/D173721 --- dom/media/ipc/PRDD.ipdl | 2 +- dom/media/ipc/RDDChild.cpp | 12 +++++------- dom/media/ipc/RDDChild.h | 7 +++++-- dom/media/ipc/RDDParent.h | 5 ++++- dom/media/ipc/RDDProcessHost.cpp | 2 +- dom/media/ipc/RDDProcessHost.h | 2 +- dom/media/ipc/RDDProcessImpl.cpp | 2 +- dom/media/ipc/RDDProcessImpl.h | 2 +- 8 files changed, 19 insertions(+), 15 deletions(-) diff --git a/dom/media/ipc/PRDD.ipdl b/dom/media/ipc/PRDD.ipdl index c7fa1919a8f2a..b7f0534f698d9 100644 --- a/dom/media/ipc/PRDD.ipdl +++ b/dom/media/ipc/PRDD.ipdl @@ -40,7 +40,7 @@ namespace mozilla { // (RemoteDataDecoder) process. There is one instance of this protocol, // with the RDDParent living on the main thread of the RDD process and // the RDDChild living on the main thread of the UI process. -[ManualDealloc, NeedsOtherPid] +[NeedsOtherPid] protocol PRDD { parent: diff --git a/dom/media/ipc/RDDChild.cpp b/dom/media/ipc/RDDChild.cpp index 5a2833afde353..fb2e14bb4fb89 100644 --- a/dom/media/ipc/RDDChild.cpp +++ b/dom/media/ipc/RDDChild.cpp @@ -34,11 +34,9 @@ namespace mozilla { using namespace layers; using namespace gfx; -RDDChild::RDDChild(RDDProcessHost* aHost) : mHost(aHost) { - MOZ_COUNT_CTOR(RDDChild); -} +RDDChild::RDDChild(RDDProcessHost* aHost) : mHost(aHost) {} -RDDChild::~RDDChild() { MOZ_COUNT_DTOR(RDDChild); } +RDDChild::~RDDChild() = default; bool RDDChild::Init() { Maybe brokerFd; @@ -210,17 +208,17 @@ void RDDChild::ActorDestroy(ActorDestroyReason aWhy) { class DeferredDeleteRDDChild : public Runnable { public: - explicit DeferredDeleteRDDChild(UniquePtr&& aChild) + explicit DeferredDeleteRDDChild(RefPtr&& aChild) : Runnable("gfx::DeferredDeleteRDDChild"), mChild(std::move(aChild)) {} NS_IMETHODIMP Run() override { return NS_OK; } private: - UniquePtr mChild; + RefPtr mChild; }; /* static */ -void RDDChild::Destroy(UniquePtr&& aChild) { +void RDDChild::Destroy(RefPtr&& aChild) { NS_DispatchToMainThread(new DeferredDeleteRDDChild(std::move(aChild))); } diff --git a/dom/media/ipc/RDDChild.h b/dom/media/ipc/RDDChild.h index c700e9cd137e8..1e0e1b439dd4a 100644 --- a/dom/media/ipc/RDDChild.h +++ b/dom/media/ipc/RDDChild.h @@ -30,8 +30,9 @@ class RDDChild final : public PRDDChild, typedef mozilla::dom::MemoryReportRequestHost MemoryReportRequestHost; public: + NS_INLINE_DECL_REFCOUNTING(RDDChild, final) + explicit RDDChild(RDDProcessHost* aHost); - ~RDDChild(); bool Init(); @@ -68,9 +69,11 @@ class RDDChild final : public PRDDChild, const bool& aMinimizeMemoryUsage, const Maybe& aDMDFile); - static void Destroy(UniquePtr&& aChild); + static void Destroy(RefPtr&& aChild); private: + ~RDDChild(); + RDDProcessHost* mHost; UniquePtr mMemoryReportRequest; #if defined(XP_LINUX) && defined(MOZ_SANDBOX) diff --git a/dom/media/ipc/RDDParent.h b/dom/media/ipc/RDDParent.h index 2e2930cabab0a..64bc0b3185a11 100644 --- a/dom/media/ipc/RDDParent.h +++ b/dom/media/ipc/RDDParent.h @@ -17,8 +17,9 @@ class ChildProfilerController; class RDDParent final : public PRDDParent { public: + NS_INLINE_DECL_REFCOUNTING(RDDParent, final) + RDDParent(); - ~RDDParent(); static RDDParent* GetSingleton(); @@ -67,6 +68,8 @@ class RDDParent final : public PRDDParent { mozilla::ipc::IPCResult RecvTestTelemetryProbes(); private: + ~RDDParent(); + const TimeStamp mLaunchTime; RefPtr mProfilerController; ipc::AsyncBlockers mShutdownBlockers; diff --git a/dom/media/ipc/RDDProcessHost.cpp b/dom/media/ipc/RDDProcessHost.cpp index d4620c3e3ac9c..41fcea38b6a03 100644 --- a/dom/media/ipc/RDDProcessHost.cpp +++ b/dom/media/ipc/RDDProcessHost.cpp @@ -168,7 +168,7 @@ void RDDProcessHost::InitAfterConnect(bool aSucceeded) { return; } mProcessToken = ++sRDDProcessTokenCounter; - mRDDChild = MakeUnique(this); + mRDDChild = MakeRefPtr(this); DebugOnly rv = TakeInitialEndpoint().Bind(mRDDChild.get()); MOZ_ASSERT(rv); diff --git a/dom/media/ipc/RDDProcessHost.h b/dom/media/ipc/RDDProcessHost.h index 68a949721a6cc..20c2c69c1587e 100644 --- a/dom/media/ipc/RDDProcessHost.h +++ b/dom/media/ipc/RDDProcessHost.h @@ -129,7 +129,7 @@ class RDDProcessHost final : public mozilla::ipc::GeckoChildProcessHost { enum class LaunchPhase { Unlaunched, Waiting, Complete }; LaunchPhase mLaunchPhase = LaunchPhase::Unlaunched; - UniquePtr mRDDChild; + RefPtr mRDDChild; uint64_t mProcessToken = 0; UniquePtr mPrefSerializer; diff --git a/dom/media/ipc/RDDProcessImpl.cpp b/dom/media/ipc/RDDProcessImpl.cpp index ca7b7c65b45c0..6ddd4ffe95b91 100644 --- a/dom/media/ipc/RDDProcessImpl.cpp +++ b/dom/media/ipc/RDDProcessImpl.cpp @@ -43,7 +43,7 @@ bool RDDProcessImpl::Init(int aArgc, char* aArgv[]) { return false; } - return mRDD.Init(TakeInitialEndpoint(), *parentBuildID); + return mRDD->Init(TakeInitialEndpoint(), *parentBuildID); } void RDDProcessImpl::CleanUp() { NS_ShutdownXPCOM(nullptr); } diff --git a/dom/media/ipc/RDDProcessImpl.h b/dom/media/ipc/RDDProcessImpl.h index 4911cc9d97b1b..a7d119a2c6bba 100644 --- a/dom/media/ipc/RDDProcessImpl.h +++ b/dom/media/ipc/RDDProcessImpl.h @@ -26,7 +26,7 @@ class RDDProcessImpl final : public ipc::ProcessChild { void CleanUp() override; private: - RDDParent mRDD; + RefPtr mRDD = new RDDParent; #if defined(XP_WIN) // This object initializes and configures COM.