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; } }
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); } }