Bug 1458971 Make operation actors explicitly hold references to the initiating object instead of using an extra MozPromise::Then(). r=baku

This commit is contained in:
Ben Kelly 2018-05-08 08:11:58 -07:00
parent 640ac3d2e8
commit e2fb37ef0a
6 changed files with 33 additions and 13 deletions

View File

@ -50,12 +50,13 @@ ClientHandle::StartOp(const ClientOpConstructorArgs& aArgs,
MaybeExecute([aArgs, kungFuGrip, aRejectCallback,
resolve = Move(aResolveCallback)] (ClientHandleChild* aActor) {
ClientHandleOpChild* actor =
new ClientHandleOpChild(aArgs, Move(resolve), Move(aRejectCallback));
new ClientHandleOpChild(kungFuGrip, aArgs, Move(resolve),
Move(aRejectCallback));
if (!aActor->SendPClientHandleOpConstructor(actor, aArgs)) {
// Constructor failure will call reject callback via ActorDestroy()
return;
}
}, [aRejectCallback, kungFuGrip] {
}, [aRejectCallback] {
aRejectCallback(NS_ERROR_DOM_INVALID_STATE_ERR);
});
}

View File

@ -6,18 +6,22 @@
#include "ClientHandleOpChild.h"
#include "ClientHandle.h"
namespace mozilla {
namespace dom {
void
ClientHandleOpChild::ActorDestroy(ActorDestroyReason aReason)
{
mClientHandle = nullptr;
mRejectCallback(NS_ERROR_DOM_ABORT_ERR);
}
mozilla::ipc::IPCResult
ClientHandleOpChild::Recv__delete__(const ClientOpResult& aResult)
{
mClientHandle = nullptr;
if (aResult.type() == ClientOpResult::Tnsresult &&
NS_FAILED(aResult.get_nsresult())) {
mRejectCallback(aResult.get_nsresult());
@ -27,12 +31,15 @@ ClientHandleOpChild::Recv__delete__(const ClientOpResult& aResult)
return IPC_OK();
}
ClientHandleOpChild::ClientHandleOpChild(const ClientOpConstructorArgs& aArgs,
ClientHandleOpChild::ClientHandleOpChild(ClientHandle* aClientHandle,
const ClientOpConstructorArgs& aArgs,
const ClientOpCallback&& aResolveCallback,
const ClientOpCallback&& aRejectCallback)
: mResolveCallback(Move(aResolveCallback))
: mClientHandle(aClientHandle)
, mResolveCallback(Move(aResolveCallback))
, mRejectCallback(Move(aRejectCallback))
{
MOZ_DIAGNOSTIC_ASSERT(mClientHandle);
MOZ_DIAGNOSTIC_ASSERT(mResolveCallback);
MOZ_DIAGNOSTIC_ASSERT(mRejectCallback);
}

View File

@ -12,8 +12,11 @@
namespace mozilla {
namespace dom {
class ClientHandle;
class ClientHandleOpChild final : public PClientHandleOpChild
{
RefPtr<ClientHandle> mClientHandle;
const ClientOpCallback mResolveCallback;
const ClientOpCallback mRejectCallback;
@ -25,7 +28,8 @@ class ClientHandleOpChild final : public PClientHandleOpChild
Recv__delete__(const ClientOpResult& aResult) override;
public:
ClientHandleOpChild(const ClientOpConstructorArgs& aArgs,
ClientHandleOpChild(ClientHandle* aClientHandle,
const ClientOpConstructorArgs& aArgs,
const ClientOpCallback&& aResolveCallback,
const ClientOpCallback&& aRejectCallback);

View File

@ -165,12 +165,10 @@ ClientManager::StartOp(const ClientOpConstructorArgs& aArgs,
// the ClientHandle might get de-refed and teardown the actor before we
// get an answer.
RefPtr<ClientManager> kungFuGrip = this;
promise->Then(aSerialEventTarget, __func__,
[kungFuGrip] (const ClientOpResult&) { },
[kungFuGrip] (nsresult) { });
MaybeExecute([aArgs, promise] (ClientManagerChild* aActor) {
ClientManagerOpChild* actor = new ClientManagerOpChild(aArgs, promise);
MaybeExecute([aArgs, promise, kungFuGrip] (ClientManagerChild* aActor) {
ClientManagerOpChild* actor =
new ClientManagerOpChild(kungFuGrip, aArgs, promise);
if (!aActor->SendPClientManagerOpConstructor(actor, aArgs)) {
// Constructor failure will reject promise via ActorDestroy()
return;

View File

@ -6,6 +6,7 @@
#include "ClientManagerOpChild.h"
#include "mozilla/dom/ClientManager.h"
#include "mozilla/ipc/ProtocolUtils.h"
namespace mozilla {
@ -14,6 +15,7 @@ namespace dom {
void
ClientManagerOpChild::ActorDestroy(ActorDestroyReason aReason)
{
mClientManager = nullptr;
if (mPromise) {
mPromise->Reject(NS_ERROR_ABORT, __func__);
mPromise = nullptr;
@ -23,6 +25,7 @@ ClientManagerOpChild::ActorDestroy(ActorDestroyReason aReason)
mozilla::ipc::IPCResult
ClientManagerOpChild::Recv__delete__(const ClientOpResult& aResult)
{
mClientManager = nullptr;
if (aResult.type() == ClientOpResult::Tnsresult &&
NS_FAILED(aResult.get_nsresult())) {
mPromise->Reject(aResult.get_nsresult(), __func__);
@ -34,10 +37,13 @@ ClientManagerOpChild::Recv__delete__(const ClientOpResult& aResult)
return IPC_OK();
}
ClientManagerOpChild::ClientManagerOpChild(const ClientOpConstructorArgs& aArgs,
ClientManagerOpChild::ClientManagerOpChild(ClientManager* aClientManager,
const ClientOpConstructorArgs& aArgs,
ClientOpPromise::Private* aPromise)
: mPromise(aPromise)
: mClientManager(aClientManager)
, mPromise(aPromise)
{
MOZ_DIAGNOSTIC_ASSERT(mClientManager);
MOZ_DIAGNOSTIC_ASSERT(mPromise);
}

View File

@ -13,8 +13,11 @@
namespace mozilla {
namespace dom {
class ClientManager;
class ClientManagerOpChild final : public PClientManagerOpChild
{
RefPtr<ClientManager> mClientManager;
RefPtr<ClientOpPromise::Private> mPromise;
// PClientManagerOpChild interface
@ -25,7 +28,8 @@ class ClientManagerOpChild final : public PClientManagerOpChild
Recv__delete__(const ClientOpResult& aResult) override;
public:
ClientManagerOpChild(const ClientOpConstructorArgs& aArgs,
ClientManagerOpChild(ClientManager* aClientManager,
const ClientOpConstructorArgs& aArgs,
ClientOpPromise::Private* aPromise);
~ClientManagerOpChild();