IToplevelProtocol::~IToplevelProtocol() { bool last = false; { MutexAutoLock al(*gProtocolMutex); for (IToplevelProtocol* actor = mOpenActors.getFirst(); actor; actor = actor->getNext()) { actor->mOpener = nullptr; } mOpenActors.clear(); if (mOpener) { removeFrom(mOpener->mOpenActors); } gNumProtocols--; last = gNumProtocols == 0; } if (last) { gProtocolMutex = nullptr; } }
NS_EXPORT void GetProtoFdInfos(NuwaProtoFdInfo* aInfoList, size_t aInfoListSize, size_t* aInfoSize) { size_t i = 0; mozilla::dom::ContentChild* content = mozilla::dom::ContentChild::GetSingleton(); aInfoList[i].protoId = content->GetProtocolId(); aInfoList[i].originFd = content->GetTransport()->GetFileDescriptor(); i++; IToplevelProtocol* actors[NUWA_TOPLEVEL_MAX]; size_t count = content->GetOpenedActorsUnsafe(actors, ArrayLength(actors)); for (size_t j = 0; j < count; j++) { IToplevelProtocol* actor = actors[j]; if (i >= aInfoListSize) { NS_RUNTIMEABORT("Too many top level protocols!"); } aInfoList[i].protoId = actor->GetProtocolId(); aInfoList[i].originFd = actor->GetTransport()->GetFileDescriptor(); i++; } if (i > NUWA_TOPLEVEL_MAX) { NS_RUNTIMEABORT("Too many top level protocols!"); } *aInfoSize = i; }
void IToplevelProtocol::GetOpenedActorsLocked(nsTArray<IToplevelProtocol*>& aActors) { gProtocolMutex.AssertCurrentThreadOwns(); for (IToplevelProtocol* actor = mOpenActors.getFirst(); actor; actor = actor->getNext()) { aActors.AppendElement(actor); } }
size_t IToplevelProtocol::GetOpenedActorsUnsafe(IToplevelProtocol** aActors, size_t aActorsMax) { size_t count = 0; for (IToplevelProtocol* actor = mOpenActors.getFirst(); actor; actor = actor->getNext()) { MOZ_RELEASE_ASSERT(count < aActorsMax); aActors[count++] = actor; } return count; }
void IToplevelProtocol::CloneOpenedToplevels(IToplevelProtocol* aTemplate, const InfallibleTArray<ProtocolFdMapping>& aFds, base::ProcessHandle aPeerProcess, ProtocolCloneContext* aCtx) { for (IToplevelProtocol* actor = aTemplate->GetFirstOpenedActors(); actor; actor = actor->getNext()) { IToplevelProtocol* newactor = actor->CloneToplevel(aFds, aPeerProcess, aCtx); AddOpenedActor(newactor); } }
IToplevelProtocol::~IToplevelProtocol() { StaticMutexAutoLock al(gProtocolMutex); for (IToplevelProtocol* actor = mOpenActors.getFirst(); actor; actor = actor->getNext()) { actor->mOpener = nullptr; } mOpenActors.clear(); if (mOpener) { removeFrom(mOpener->mOpenActors); } }