gecko-dev/gfx/vr/ipc/VRChild.h
Andrew McCreight f6f2bd8f6e Bug 1655536, part 2 - Don't wait for memory reports from child processes that no longer exist. r=froydnj
This patch uses IPDL's return feature to ensure that the memory
reporter manager won't wait for a report from a child process
that has already exited.

This fixes a memory reporter hang that can happen if a child process
exits during a memory report, when the parent half of the actor is
being held alive. (If the parent half of the actor is not being held
alive, then mMemoryReportRequest will be naturally cleared when it
goes away.)

This was happening frequently on Windows Fission AWSY because that test
does a minimize memory right before it attempts to get a memory report,
and the preallocated content process exits when it sees a message to
minimize memory.

Differential Revision: https://phabricator.services.mozilla.com/D85499
2020-08-03 18:29:45 +00:00

64 lines
2.0 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef GFX_VR_CHILD_H
#define GFX_VR_CHILD_H
#include "mozilla/gfx/PVRChild.h"
#include "mozilla/gfx/gfxVarReceiver.h"
#include "mozilla/ipc/CrashReporterHelper.h"
#include "mozilla/VsyncDispatcher.h"
#include "moz_external_vr.h"
namespace mozilla {
namespace dom {
class MemoryReportRequestHost;
} // namespace dom
namespace gfx {
class VRProcessParent;
class VRChild;
class VRChild final : public PVRChild,
public ipc::CrashReporterHelper<GeckoProcessType_VR>,
public gfxVarReceiver {
typedef mozilla::dom::MemoryReportRequestHost MemoryReportRequestHost;
friend class PVRChild;
public:
explicit VRChild(VRProcessParent* aHost);
~VRChild() = default;
static void Destroy(UniquePtr<VRChild>&& aChild);
void Init();
bool EnsureVRReady();
virtual void OnVarChanged(const GfxVarUpdate& aVar) override;
bool SendRequestMemoryReport(const uint32_t& aGeneration,
const bool& aAnonymize,
const bool& aMinimizeMemoryUsage,
const Maybe<ipc::FileDescriptor>& aDMDFile);
protected:
virtual void ActorDestroy(ActorDestroyReason aWhy) override;
mozilla::ipc::IPCResult RecvOpenVRControllerActionPathToParent(
const nsCString& aPath);
mozilla::ipc::IPCResult RecvOpenVRControllerManifestPathToParent(
const VRControllerType& aType, const nsCString& aPath);
mozilla::ipc::IPCResult RecvInitComplete();
mozilla::ipc::IPCResult RecvAddMemoryReport(const MemoryReport& aReport);
private:
VRProcessParent* mHost;
UniquePtr<MemoryReportRequestHost> mMemoryReportRequest;
bool mVRReady;
};
} // namespace gfx
} // namespace mozilla
#endif // GFX_VR_CHILD_H