mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 10:44:56 +00:00
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:
parent
640ac3d2e8
commit
e2fb37ef0a
@ -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);
|
||||
});
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user