diff --git a/gfx/ipc/GPUProcessManager.cpp b/gfx/ipc/GPUProcessManager.cpp index c8fecf0570f2..2c81abb46215 100644 --- a/gfx/ipc/GPUProcessManager.cpp +++ b/gfx/ipc/GPUProcessManager.cpp @@ -804,8 +804,8 @@ bool GPUProcessManager::CreateContentCompositorManager( if (mGPUChild) { mGPUChild->SendNewContentCompositorManager(std::move(parentPipe)); - } else { - CompositorManagerParent::Create(std::move(parentPipe)); + } else if (!CompositorManagerParent::Create(std::move(parentPipe))) { + return false; } *aOutEndpoint = std::move(childPipe); diff --git a/gfx/ipc/VsyncBridgeChild.cpp b/gfx/ipc/VsyncBridgeChild.cpp index 40b1b17e6c55..31f2a49aa922 100644 --- a/gfx/ipc/VsyncBridgeChild.cpp +++ b/gfx/ipc/VsyncBridgeChild.cpp @@ -12,7 +12,7 @@ namespace gfx { VsyncBridgeChild::VsyncBridgeChild(RefPtr aThread, const uint64_t& aProcessToken) - : mThread(aThread), mLoop(nullptr), mProcessToken(aProcessToken) {} + : mThread(aThread), mProcessToken(aProcessToken) {} VsyncBridgeChild::~VsyncBridgeChild() {} @@ -39,8 +39,6 @@ void VsyncBridgeChild::Open(Endpoint&& aEndpoint) { return; } - mLoop = MessageLoop::current(); - // Last reference is freed in DeallocPVsyncBridgeChild. AddRef(); } @@ -66,7 +64,7 @@ class NotifyVsyncTask : public Runnable { }; bool VsyncBridgeChild::IsOnVsyncIOThread() const { - return MessageLoop::current() == mLoop; + return mThread->IsOnCurrentThread(); } void VsyncBridgeChild::NotifyVsync(const VsyncEvent& aVsync, @@ -75,7 +73,7 @@ void VsyncBridgeChild::NotifyVsync(const VsyncEvent& aVsync, MOZ_ASSERT(!IsOnVsyncIOThread()); RefPtr task = new NotifyVsyncTask(this, aVsync, aLayersId); - mLoop->PostTask(task.forget()); + mThread->Dispatch(task.forget()); } void VsyncBridgeChild::NotifyVsyncImpl(const VsyncEvent& aVsync, @@ -91,8 +89,8 @@ void VsyncBridgeChild::NotifyVsyncImpl(const VsyncEvent& aVsync, void VsyncBridgeChild::Close() { if (!IsOnVsyncIOThread()) { - mLoop->PostTask(NewRunnableMethod("gfx::VsyncBridgeChild::Close", this, - &VsyncBridgeChild::Close)); + mThread->Dispatch(NewRunnableMethod("gfx::VsyncBridgeChild::Close", this, + &VsyncBridgeChild::Close)); return; } diff --git a/gfx/ipc/VsyncBridgeChild.h b/gfx/ipc/VsyncBridgeChild.h index d49c557c91b6..9e25a45db496 100644 --- a/gfx/ipc/VsyncBridgeChild.h +++ b/gfx/ipc/VsyncBridgeChild.h @@ -47,7 +47,6 @@ class VsyncBridgeChild final : public PVsyncBridgeChild { private: RefPtr mThread; - MessageLoop* mLoop; uint64_t mProcessToken; }; diff --git a/gfx/ipc/VsyncIOThreadHolder.h b/gfx/ipc/VsyncIOThreadHolder.h index ac305c7898c3..b5ea0c2c1fa5 100644 --- a/gfx/ipc/VsyncIOThreadHolder.h +++ b/gfx/ipc/VsyncIOThreadHolder.h @@ -23,6 +23,14 @@ class VsyncIOThreadHolder final { RefPtr GetThread() const; + bool IsOnCurrentThread() const { + return mThread->IsOnCurrentThread(); + } + + void Dispatch(already_AddRefed task) { + mThread->Dispatch(std::move(task), NS_DISPATCH_NORMAL); + } + private: ~VsyncIOThreadHolder(); diff --git a/gfx/layers/ipc/CompositorManagerParent.cpp b/gfx/layers/ipc/CompositorManagerParent.cpp index bb42a0350b08..5b954b4b6038 100644 --- a/gfx/layers/ipc/CompositorManagerParent.cpp +++ b/gfx/layers/ipc/CompositorManagerParent.cpp @@ -49,7 +49,7 @@ CompositorManagerParent::CreateSameProcess() { } /* static */ -void CompositorManagerParent::Create( +bool CompositorManagerParent::Create( Endpoint&& aEndpoint) { MOZ_ASSERT(NS_IsMainThread()); @@ -57,6 +57,10 @@ void CompositorManagerParent::Create( // (or UI process if it subsumbed the GPU process). MOZ_ASSERT(aEndpoint.OtherPid() != base::GetCurrentProcId()); + if (!CompositorThreadHolder::IsActive()) { + return false; + } + RefPtr bridge = new CompositorManagerParent(); RefPtr runnable = @@ -64,6 +68,7 @@ void CompositorManagerParent::Create( "CompositorManagerParent::Bind", bridge, &CompositorManagerParent::Bind, std::move(aEndpoint)); CompositorThreadHolder::Loop()->PostTask(runnable.forget()); + return true; } /* static */ diff --git a/gfx/layers/ipc/CompositorManagerParent.h b/gfx/layers/ipc/CompositorManagerParent.h index e18dc095a6ba..e925e8c918f7 100644 --- a/gfx/layers/ipc/CompositorManagerParent.h +++ b/gfx/layers/ipc/CompositorManagerParent.h @@ -30,7 +30,7 @@ class CompositorManagerParent final : public PCompositorManagerParent { public: static already_AddRefed CreateSameProcess(); - static void Create(Endpoint&& aEndpoint); + static bool Create(Endpoint&& aEndpoint); static void Shutdown(); static already_AddRefed diff --git a/gfx/layers/ipc/ImageBridgeParent.cpp b/gfx/layers/ipc/ImageBridgeParent.cpp index 5a360ed34f12..888fa9110192 100644 --- a/gfx/layers/ipc/ImageBridgeParent.cpp +++ b/gfx/layers/ipc/ImageBridgeParent.cpp @@ -91,6 +91,10 @@ bool ImageBridgeParent::CreateForGPUProcess( MOZ_ASSERT(XRE_GetProcessType() == GeckoProcessType_GPU); MessageLoop* loop = CompositorThreadHolder::Loop(); + if (!loop) { + return false; + } + RefPtr parent = new ImageBridgeParent(loop, aEndpoint.OtherPid()); @@ -211,6 +215,9 @@ mozilla::ipc::IPCResult ImageBridgeParent::RecvUpdate( bool ImageBridgeParent::CreateForContent( Endpoint&& aEndpoint) { MessageLoop* loop = CompositorThreadHolder::Loop(); + if (!loop) { + return false; + } RefPtr bridge = new ImageBridgeParent(loop, aEndpoint.OtherPid()); diff --git a/gfx/vr/ipc/VRManagerParent.cpp b/gfx/vr/ipc/VRManagerParent.cpp index b6a51825d372..81d594ba052f 100644 --- a/gfx/vr/ipc/VRManagerParent.cpp +++ b/gfx/vr/ipc/VRManagerParent.cpp @@ -74,6 +74,9 @@ void VRManagerParent::UnregisterFromManager() { /* static */ bool VRManagerParent::CreateForContent(Endpoint&& aEndpoint) { MessageLoop* loop = CompositorThreadHolder::Loop(); + if (!loop) { + return false; + } RefPtr vmp = new VRManagerParent(aEndpoint.OtherPid(), true); loop->PostTask(NewRunnableMethod&&>(