Bug 1451363 - part 2b - move protocol event target access into ProtocolState; r=mccr8

The reasoning here is the same as for the protocol register/lookup
functions: these functions are all basic functionality that should not
be overriden by subclasses.
This commit is contained in:
Nathan Froyd 2018-04-23 14:13:37 -04:00
Родитель 8196fc2720
Коммит 7b8c73c090
2 изменённых файлов: 82 добавлений и 72 удалений

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

@ -534,7 +534,7 @@ IProtocol::SetEventTargetForActor(IProtocol* aActor, nsIEventTarget* aEventTarge
{
// Make sure we have a manager for the internal method to access.
aActor->SetManager(this);
SetEventTargetForActorInternal(aActor, aEventTarget);
mState->SetEventTargetForActor(aActor, aEventTarget);
}
void
@ -543,37 +543,51 @@ IProtocol::ReplaceEventTargetForActor(IProtocol* aActor,
{
// Ensure the actor has been registered.
MOZ_ASSERT(aActor->Manager());
ReplaceEventTargetForActorInternal(aActor, aEventTarget);
}
void
IProtocol::SetEventTargetForActorInternal(IProtocol* aActor,
nsIEventTarget* aEventTarget)
{
Manager()->SetEventTargetForActorInternal(aActor, aEventTarget);
}
void
IProtocol::ReplaceEventTargetForActorInternal(IProtocol* aActor,
nsIEventTarget* aEventTarget)
{
Manager()->ReplaceEventTargetForActorInternal(aActor, aEventTarget);
mState->ReplaceEventTargetForActor(aActor, aEventTarget);
}
nsIEventTarget*
IProtocol::GetActorEventTarget()
{
// We should only call this function when this actor has been registered and
// is not unregistered yet.
MOZ_RELEASE_ASSERT(mId != kNullActorId && mId != kFreedActorId);
RefPtr<nsIEventTarget> target = Manager()->GetActorEventTargetInternal(this);
return target;
return mState->GetActorEventTarget();
}
already_AddRefed<nsIEventTarget>
IProtocol::GetActorEventTargetInternal(IProtocol* aActor)
IProtocol::GetActorEventTarget(IProtocol* aActor)
{
return Manager()->GetActorEventTargetInternal(aActor);
return mState->GetActorEventTarget(aActor);
}
nsIEventTarget*
IProtocol::ManagedState::GetActorEventTarget()
{
// We should only call this function when this actor has been registered and
// is not unregistered yet.
MOZ_RELEASE_ASSERT(mProtocol->mId != kNullActorId && mProtocol->mId != kFreedActorId);
RefPtr<nsIEventTarget> target = GetActorEventTarget(mProtocol);
return target;
}
void
IProtocol::ManagedState::SetEventTargetForActor(IProtocol* aActor,
nsIEventTarget* aEventTarget)
{
// Go directly through the state so we don't try to redundantly (and
// wrongly) call SetManager() on aActor.
mProtocol->Manager()->mState->SetEventTargetForActor(aActor, aEventTarget);
}
void
IProtocol::ManagedState::ReplaceEventTargetForActor(IProtocol* aActor,
nsIEventTarget* aEventTarget)
{
mProtocol->Manager()->ReplaceEventTargetForActor(aActor, aEventTarget);
}
already_AddRefed<nsIEventTarget>
IProtocol::ManagedState::GetActorEventTarget(IProtocol* aActor)
{
return mProtocol->Manager()->GetActorEventTarget(aActor);
}
IToplevelProtocol::IToplevelProtocol(ProtocolId aProtoId, Side aSide)
@ -581,8 +595,7 @@ IToplevelProtocol::IToplevelProtocol(ProtocolId aProtoId, Side aSide)
mMonitor("mozilla.ipc.IToplevelProtocol.mMonitor"),
mProtocolId(aProtoId),
mOtherPid(mozilla::ipc::kInvalidProcessId),
mOtherPidState(ProcessIdState::eUnstarted),
mEventTargetMutex("ProtocolEventTargetMutex")
mOtherPidState(ProcessIdState::eUnstarted)
{
}
@ -742,6 +755,7 @@ IToplevelProtocol::ToplevelState::ToplevelState(IToplevelProtocol* aProtocol, Si
: mProtocol(aProtocol)
, mLastRouteId(aSide == ParentSide ? kFreedActorId : kNullActorId)
, mLastShmemId(aSide == ParentSide ? kFreedActorId : kNullActorId)
, mEventTargetMutex("ProtocolEventTargetMutex")
{
}
@ -862,7 +876,7 @@ IToplevelProtocol::ToplevelState::ShmemDestroyed(const Message& aMsg)
}
already_AddRefed<nsIEventTarget>
IToplevelProtocol::GetMessageEventTarget(const Message& aMsg)
IToplevelProtocol::ToplevelState::GetMessageEventTarget(const Message& aMsg)
{
int32_t route = aMsg.routing_id();
@ -883,7 +897,7 @@ IToplevelProtocol::GetMessageEventTarget(const Message& aMsg)
// one.
if (!target) {
MutexAutoUnlock unlock(mEventTargetMutex);
target = GetConstructedEventTarget(aMsg);
target = mProtocol->GetConstructedEventTarget(aMsg);
}
mEventTargetMap.AddWithID(target, handle.mId);
@ -891,14 +905,14 @@ IToplevelProtocol::GetMessageEventTarget(const Message& aMsg)
// We don't need the lock after this point.
lock.reset();
target = GetSpecificMessageEventTarget(aMsg);
target = mProtocol->GetSpecificMessageEventTarget(aMsg);
}
return target.forget();
}
already_AddRefed<nsIEventTarget>
IToplevelProtocol::GetActorEventTargetInternal(IProtocol* aActor)
IToplevelProtocol::ToplevelState::GetActorEventTarget(IProtocol* aActor)
{
MOZ_RELEASE_ASSERT(aActor->Id() != kNullActorId && aActor->Id() != kFreedActorId);
@ -907,25 +921,19 @@ IToplevelProtocol::GetActorEventTargetInternal(IProtocol* aActor)
return target.forget();
}
already_AddRefed<nsIEventTarget>
IToplevelProtocol::GetActorEventTarget(IProtocol* aActor)
{
return GetActorEventTargetInternal(aActor);
}
nsIEventTarget*
IToplevelProtocol::GetActorEventTarget()
IToplevelProtocol::ToplevelState::GetActorEventTarget()
{
// The EventTarget of a ToplevelProtocol shall never be set.
return nullptr;
}
void
IToplevelProtocol::SetEventTargetForActorInternal(IProtocol* aActor,
nsIEventTarget* aEventTarget)
IToplevelProtocol::ToplevelState::SetEventTargetForActor(IProtocol* aActor,
nsIEventTarget* aEventTarget)
{
// The EventTarget of a ToplevelProtocol shall never be set.
MOZ_RELEASE_ASSERT(aActor != this);
MOZ_RELEASE_ASSERT(aActor != mProtocol);
// We should only call this function on actors that haven't been used for IPC
// code yet. Otherwise we'll be posting stuff to the wrong event target before
@ -952,12 +960,12 @@ IToplevelProtocol::SetEventTargetForActorInternal(IProtocol* aActor,
}
void
IToplevelProtocol::ReplaceEventTargetForActorInternal(
IToplevelProtocol::ToplevelState::ReplaceEventTargetForActor(
IProtocol* aActor,
nsIEventTarget* aEventTarget)
{
// The EventTarget of a ToplevelProtocol shall never be set.
MOZ_RELEASE_ASSERT(aActor != this);
MOZ_RELEASE_ASSERT(aActor != mProtocol);
int32_t id = aActor->Id();
// The ID of the actor should have existed.

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

@ -173,6 +173,15 @@ public:
virtual int32_t RegisterID(IProtocol*, int32_t) = 0;
virtual IProtocol* Lookup(int32_t) = 0;
virtual void Unregister(int32_t) = 0;
// Returns the event target set by SetEventTargetForActor() if available.
virtual nsIEventTarget* GetActorEventTarget() = 0;
virtual void SetEventTargetForActor(IProtocol* aActor, nsIEventTarget* aEventTarget) = 0;
virtual void ReplaceEventTargetForActor(IProtocol* aActor, nsIEventTarget* aEventTarget) = 0;
virtual already_AddRefed<nsIEventTarget>
GetActorEventTarget(IProtocol* aActor) = 0;
};
// Managed protocols just forward all of their operations to the topmost
@ -195,6 +204,11 @@ public:
IProtocol* Lookup(int32_t) override;
void Unregister(int32_t) override;
nsIEventTarget* GetActorEventTarget() override;
void SetEventTargetForActor(IProtocol* aActor, nsIEventTarget* aEventTarget) override;
void ReplaceEventTargetForActor(IProtocol* aActor, nsIEventTarget* aEventTarget) override;
already_AddRefed<nsIEventTarget> GetActorEventTarget(IProtocol* aActor) override;
private:
IProtocol* const mProtocol;
};
@ -284,8 +298,8 @@ public:
void ReplaceEventTargetForActor(IProtocol* aActor,
nsIEventTarget* aEventTarget);
// Returns the event target set by SetEventTargetForActor() if available.
virtual nsIEventTarget* GetActorEventTarget();
nsIEventTarget* GetActorEventTarget();
already_AddRefed<nsIEventTarget> GetActorEventTarget(IProtocol* aActor);
protected:
IProtocol(Side aSide, UniquePtr<ProtocolState> aState)
@ -303,14 +317,6 @@ protected:
void SetManager(IProtocol* aManager);
void SetIPCChannel(MessageChannel* aChannel) { mChannel = aChannel; }
virtual void SetEventTargetForActorInternal(IProtocol* aActor, nsIEventTarget* aEventTarget);
virtual void ReplaceEventTargetForActorInternal(
IProtocol* aActor,
nsIEventTarget* aEventTarget);
virtual already_AddRefed<nsIEventTarget>
GetActorEventTargetInternal(IProtocol* aActor);
static const int32_t kNullActorId = 0;
static const int32_t kFreedActorId = 1;
@ -390,12 +396,23 @@ public:
IProtocol* Lookup(int32_t) override;
void Unregister(int32_t) override;
nsIEventTarget* GetActorEventTarget() override;
void SetEventTargetForActor(IProtocol* aActor, nsIEventTarget* aEventTarget) override;
void ReplaceEventTargetForActor(IProtocol* aActor, nsIEventTarget* aEventTarget) override;
already_AddRefed<nsIEventTarget> GetActorEventTarget(IProtocol* aActor) override;
virtual already_AddRefed<nsIEventTarget>
GetMessageEventTarget(const Message& aMsg);
private:
IToplevelProtocol* const mProtocol;
IDMap<IProtocol*> mActorMap;
int32_t mLastRouteId;
IDMap<Shmem::SharedMemory*> mShmemMap;
Shmem::id_t mLastShmemId;
Mutex mEventTargetMutex;
IDMap<nsCOMPtr<nsIEventTarget>> mEventTargetMap;
};
using SchedulerGroupSet = nsILabelableRunnable::SchedulerGroupSet;
@ -519,20 +536,17 @@ public:
return false;
}
virtual already_AddRefed<nsIEventTarget>
GetMessageEventTarget(const Message& aMsg);
already_AddRefed<nsIEventTarget>
GetActorEventTarget(IProtocol* aActor);
virtual nsIEventTarget*
GetActorEventTarget() override;
virtual void OnChannelReceivedMessage(const Message& aMsg) {}
bool IsMainThreadProtocol() const { return mIsMainThreadProtocol; }
void SetIsMainThreadProtocol() { mIsMainThreadProtocol = NS_IsMainThread(); }
already_AddRefed<nsIEventTarget>
GetMessageEventTarget(const Message& aMsg)
{
return DowncastState()->GetMessageEventTarget(aMsg);
}
protected:
ToplevelState* DowncastState() const
{
@ -549,15 +563,6 @@ protected:
virtual already_AddRefed<nsIEventTarget>
GetSpecificMessageEventTarget(const Message& aMsg) { return nullptr; }
virtual void SetEventTargetForActorInternal(IProtocol* aActor,
nsIEventTarget* aEventTarget) override;
virtual void ReplaceEventTargetForActorInternal(
IProtocol* aActor,
nsIEventTarget* aEventTarget) override;
virtual already_AddRefed<nsIEventTarget>
GetActorEventTargetInternal(IProtocol* aActor) override;
// This monitor protects mOtherPid and mOtherPidState. All other fields
// should only be accessed on the worker thread.
mutable mozilla::Monitor mMonitor;
@ -569,9 +574,6 @@ protected:
base::ProcessId mOtherPid;
ProcessIdState mOtherPidState;
bool mIsMainThreadProtocol;
Mutex mEventTargetMutex;
IDMap<nsCOMPtr<nsIEventTarget>> mEventTargetMap;
};
class IShmemAllocator