gecko-dev/gfx/ipc/VsyncBridgeChild.h
Andrew Osmond 5756f575b9 Bug 1534749 - Handle shutdown races between the compositor thread and IPDL object setup. r=rhunt
When the compositor thread has begun shutdown, it will spin the event
loop for the main thread until the last CompositorThreadHolder reference
has been released. While spinning, new IPDL objects may be attempted to
be created which depend on the compositor thread; we should check to
ensure the compositor thread is still around before proceeding with
creation. These objects include CompositorManagerParent,
ImageBridgeParent, and VRManagerParent. Additionally there is a very
similar bug between the vsync thread and VsyncBridgeChild.

Differential Revision: https://phabricator.services.mozilla.com/D23308
2019-03-26 14:21:56 -04:00

56 lines
1.7 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 include_gfx_ipc_VsyncBridgeChild_h
#define include_gfx_ipc_VsyncBridgeChild_h
#include "mozilla/RefPtr.h"
#include "mozilla/gfx/PVsyncBridgeChild.h"
namespace mozilla {
namespace gfx {
class VsyncIOThreadHolder;
class VsyncBridgeChild final : public PVsyncBridgeChild {
friend class NotifyVsyncTask;
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VsyncBridgeChild)
static RefPtr<VsyncBridgeChild> Create(
RefPtr<VsyncIOThreadHolder> aThread, const uint64_t& aProcessToken,
Endpoint<PVsyncBridgeChild>&& aEndpoint);
void Close();
void ActorDestroy(ActorDestroyReason aWhy) override;
void DeallocPVsyncBridgeChild() override;
void ProcessingError(Result aCode, const char* aReason) override;
void NotifyVsync(const VsyncEvent& aVsync, const layers::LayersId& aLayersId);
virtual void HandleFatalError(const char* aMsg) const override;
private:
VsyncBridgeChild(RefPtr<VsyncIOThreadHolder>, const uint64_t& aProcessToken);
~VsyncBridgeChild();
void Open(Endpoint<PVsyncBridgeChild>&& aEndpoint);
void NotifyVsyncImpl(const VsyncEvent& aVsync,
const layers::LayersId& aLayersId);
bool IsOnVsyncIOThread() const;
private:
RefPtr<VsyncIOThreadHolder> mThread;
uint64_t mProcessToken;
};
} // namespace gfx
} // namespace mozilla
#endif // include_gfx_ipc_VsyncBridgeChild_h