Bug 1451363 - part 2a - move protocol register/lookup functions into ProtocolState; r=mccr8

This functionality is base functionality for top-level and non-toplevel
protocols; nobody overrides this stuff, so it's safe to move into
ProtocolState.
This commit is contained in:
Nathan Froyd 2018-04-23 14:13:37 -04:00
parent a796a8f982
commit 8196fc2720
2 changed files with 55 additions and 29 deletions

View File

@ -398,30 +398,30 @@ IProtocol::ReadActor(const IPC::Message* aMessage, PickleIterator* aIter, bool a
}
int32_t
IProtocol::Register(IProtocol* aRouted)
IProtocol::ManagedState::Register(IProtocol* aRouted)
{
return Manager()->Register(aRouted);
return mProtocol->Manager()->Register(aRouted);
}
int32_t
IProtocol::RegisterID(IProtocol* aRouted, int32_t aId)
IProtocol::ManagedState::RegisterID(IProtocol* aRouted, int32_t aId)
{
return Manager()->RegisterID(aRouted, aId);
return mProtocol->Manager()->RegisterID(aRouted, aId);
}
IProtocol*
IProtocol::Lookup(int32_t aId)
IProtocol::ManagedState::Lookup(int32_t aId)
{
return Manager()->Lookup(aId);
return mProtocol->Manager()->Lookup(aId);
}
void
IProtocol::Unregister(int32_t aId)
IProtocol::ManagedState::Unregister(int32_t aId)
{
if (mId == aId) {
mId = kFreedActorId;
if (mProtocol->mId == aId) {
mProtocol->mId = kFreedActorId;
}
Manager()->Unregister(aId);
mProtocol->Manager()->Unregister(aId);
}
Shmem::SharedMemory*
@ -582,7 +582,6 @@ IToplevelProtocol::IToplevelProtocol(ProtocolId aProtoId, Side aSide)
mProtocolId(aProtoId),
mOtherPid(mozilla::ipc::kInvalidProcessId),
mOtherPidState(ProcessIdState::eUnstarted),
mLastRouteId(aSide == ParentSide ? kFreedActorId : kNullActorId),
mEventTargetMutex("ProtocolEventTargetMutex")
{
}
@ -694,13 +693,13 @@ IToplevelProtocol::IsOnCxxStack() const
}
int32_t
IToplevelProtocol::Register(IProtocol* aRouted)
IToplevelProtocol::ToplevelState::Register(IProtocol* aRouted)
{
if (aRouted->Id() != kNullActorId && aRouted->Id() != kFreedActorId) {
// If there's already an ID, just return that.
return aRouted->Id();
}
int32_t id = GetSide() == ParentSide ? ++mLastRouteId : --mLastRouteId;
int32_t id = mProtocol->GetSide() == ParentSide ? ++mLastRouteId : --mLastRouteId;
mActorMap.AddWithID(aRouted, id);
aRouted->SetId(id);
@ -716,8 +715,8 @@ IToplevelProtocol::Register(IProtocol* aRouted)
}
int32_t
IToplevelProtocol::RegisterID(IProtocol* aRouted,
int32_t aId)
IToplevelProtocol::ToplevelState::RegisterID(IProtocol* aRouted,
int32_t aId)
{
mActorMap.AddWithID(aRouted, aId);
aRouted->SetId(aId);
@ -725,13 +724,13 @@ IToplevelProtocol::RegisterID(IProtocol* aRouted,
}
IProtocol*
IToplevelProtocol::Lookup(int32_t aId)
IToplevelProtocol::ToplevelState::Lookup(int32_t aId)
{
return mActorMap.Lookup(aId);
}
void
IToplevelProtocol::Unregister(int32_t aId)
IToplevelProtocol::ToplevelState::Unregister(int32_t aId)
{
mActorMap.Remove(aId);
@ -741,6 +740,7 @@ IToplevelProtocol::Unregister(int32_t aId)
IToplevelProtocol::ToplevelState::ToplevelState(IToplevelProtocol* aProtocol, Side aSide)
: mProtocol(aProtocol)
, mLastRouteId(aSide == ParentSide ? kFreedActorId : kNullActorId)
, mLastShmemId(aSide == ParentSide ? kFreedActorId : kNullActorId)
{
}

View File

@ -159,12 +159,20 @@ public:
class ProtocolState
{
public:
virtual ~ProtocolState() = default;
// Shared memory functions.
virtual Shmem::SharedMemory* CreateSharedMemory(
size_t, SharedMemory::SharedMemoryType, bool, int32_t*) = 0;
virtual Shmem::SharedMemory* LookupSharedMemory(int32_t) = 0;
virtual bool IsTrackingSharedMemory(Shmem::SharedMemory*) = 0;
virtual bool DestroySharedMemory(Shmem&) = 0;
virtual ~ProtocolState() = default;
// Protocol management functions.
virtual int32_t Register(IProtocol*) = 0;
virtual int32_t RegisterID(IProtocol*, int32_t) = 0;
virtual IProtocol* Lookup(int32_t) = 0;
virtual void Unregister(int32_t) = 0;
};
// Managed protocols just forward all of their operations to the topmost
@ -182,6 +190,11 @@ public:
bool IsTrackingSharedMemory(Shmem::SharedMemory*) override;
bool DestroySharedMemory(Shmem&) override;
int32_t Register(IProtocol*) override;
int32_t RegisterID(IProtocol*, int32_t) override;
IProtocol* Lookup(int32_t) override;
void Unregister(int32_t) override;
private:
IProtocol* const mProtocol;
};
@ -194,10 +207,23 @@ public:
: IProtocol(aSide, MakeUnique<ManagedState>(this))
{}
virtual int32_t Register(IProtocol*);
virtual int32_t RegisterID(IProtocol*, int32_t);
virtual IProtocol* Lookup(int32_t);
virtual void Unregister(int32_t);
int32_t Register(IProtocol* aRouted)
{
return mState->Register(aRouted);
}
int32_t RegisterID(IProtocol* aRouted, int32_t aId)
{
return mState->RegisterID(aRouted, aId);
}
IProtocol* Lookup(int32_t aId)
{
return mState->Lookup(aId);
}
void Unregister(int32_t aId)
{
return mState->Unregister(aId);
}
virtual void RemoveManagee(int32_t, IProtocol*) = 0;
Shmem::SharedMemory* CreateSharedMemory(
@ -359,8 +385,15 @@ public:
bool ShmemCreated(const Message& aMsg);
bool ShmemDestroyed(const Message& aMsg);
int32_t Register(IProtocol*) override;
int32_t RegisterID(IProtocol*, int32_t) override;
IProtocol* Lookup(int32_t) override;
void Unregister(int32_t) override;
private:
IToplevelProtocol* const mProtocol;
IDMap<IProtocol*> mActorMap;
int32_t mLastRouteId;
IDMap<Shmem::SharedMemory*> mShmemMap;
Shmem::id_t mLastShmemId;
};
@ -408,11 +441,6 @@ public:
void SetReplyTimeoutMs(int32_t aTimeoutMs);
virtual int32_t Register(IProtocol*) override;
virtual int32_t RegisterID(IProtocol*, int32_t) override;
virtual IProtocol* Lookup(int32_t) override;
virtual void Unregister(int32_t) override;
void DeallocShmems() { DowncastState()->DeallocShmems(); }
bool ShmemCreated(const Message& aMsg) { return DowncastState()->ShmemCreated(aMsg); }
@ -540,8 +568,6 @@ protected:
UniquePtr<Transport> mTrans;
base::ProcessId mOtherPid;
ProcessIdState mOtherPidState;
IDMap<IProtocol*> mActorMap;
int32_t mLastRouteId;
bool mIsMainThreadProtocol;
Mutex mEventTargetMutex;