Bug 1413606 P1 Add ClientThing base class. r=baku

This commit is contained in:
Ben Kelly 2017-11-01 13:19:37 -04:00
Родитель e606f865f0
Коммит 072e50166a
2 изменённых файлов: 109 добавлений и 0 удалений

Просмотреть файл

@ -0,0 +1,108 @@
/* -*- 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 _mozilla_dom_ClientThing_h
#define _mozilla_dom_ClientThing_h
#include "nsTArray.h"
namespace mozilla {
namespace dom {
// Base class representing various Client "things" such as ClientHandle,
// ClientSource, and ClientManager. Currently it provides a common set
// of code for handling activation and shutdown of IPC actors.
template <typename ActorType>
class ClientThing
{
ActorType* mActor;
bool mShutdown;
protected:
ClientThing()
: mActor(nullptr)
, mShutdown(false)
{
}
~ClientThing()
{
ShutdownThing();
}
// Return the current actor.
ActorType*
GetActor() const
{
return mActor;
}
// Returns true if ShutdownThing() has been called.
bool
IsShutdown() const
{
return mShutdown;
}
// Conditionally execute the given callable based on the current state.
template<typename Callable>
void
MaybeExecute(const Callable& aCallable)
{
if (mShutdown) {
return;
}
MOZ_DIAGNOSTIC_ASSERT(mActor);
aCallable(mActor);
}
// Attach activate the thing by attaching its underlying IPC actor. This
// will make the thing register as the actor's owner as well. The actor
// must call RevokeActor() to clear this weak back reference before its
// destroyed.
void
ActivateThing(ActorType* aActor)
{
MOZ_DIAGNOSTIC_ASSERT(aActor);
MOZ_DIAGNOSTIC_ASSERT(!mActor);
MOZ_DIAGNOSTIC_ASSERT(!mShutdown);
mActor = aActor;
mActor->SetOwner(this);
}
// Start destroying the underlying actor and disconnect the thing.
void
ShutdownThing()
{
if (mShutdown) {
return;
}
mShutdown = true;
// If we are shutdown before the actor, then clear the weak references
// between the actor and the thing.
if (mActor) {
mActor->RevokeOwner(this);
mActor->MaybeStartTeardown();
mActor = nullptr;
}
}
public:
// Clear the weak references between the thing and its IPC actor.
void
RevokeActor(ActorType* aActor)
{
MOZ_DIAGNOSTIC_ASSERT(mActor);
MOZ_DIAGNOSTIC_ASSERT(mActor == aActor);
mActor->RevokeOwner(this);
mActor = nullptr;
}
};
} // namespace dom
} // namespace mozilla
#endif // _mozilla_dom_ClientThing_h

Просмотреть файл

@ -8,6 +8,7 @@ EXPORTS.mozilla.dom += [
'ClientInfo.h',
'ClientIPCUtils.h',
'ClientState.h',
'ClientThing.h',
]
UNIFIED_SOURCES += [