import changes from `dev' branch of rmottola/Arctic-Fox:

- Bug 1182979 - Part 1: Use nsTHashtable::Iterator in PluginInstanceChild. r=jimm (a3105fe02)
- Bug 1182979 - Part 2: Use nsTHashtable::Iterator in PluginScriptableObjectChild. r=jimm (301bd8d3c)
- Bug 1182979 - Part 3: Use nsTHashtable::Iterator in GMPTimerParent. r=cpearce (e35ef2491)
- Bug 1182979 - Part 4: Use nsTHashtable::Iterator in MediaShutdownManager. r=cpearce (22dcbe9cd)
- Bug 1186780: Replace EnumerateRead with new iterators in cycle collection code. r=mccr8 (263c26445)
- Bug 1182980 - Part 1: Use nsTHashtable::Iterator in FragmentOrElement. r=khuey (ca3c5dfb5)
- Bug 1182980 - Part 2: Use nsTHashtable::Iterator in nsRange. r=khuey (5b43675ac)
- Bug 1182980 - Part 3: Use nsTHashtable::Iterator in nsWindowRoot. r=khuey (f4d8b2a4b)
- Bug 1182980 - Part 4: Use nsTHashtable::Iterator in nsWindowMemoryReporter::UnlinkGhostWindows. r=khuey (b01946afe)
- Bug 1182980 - Part 5: Use nsTHashtable::Iterator in nsWindowMemoryReporter::CollectReports. r=khuey (336538295)
- Bug 1182980 - Part 6: Use nsTHashtable::Iterator in ShadowRoot. r=khuey (d59bf3da0)
- Bug 1182980 - Part 7: Use nsTHashtable::Iterator in nsIdentifierMapEntry::FireChangeCallbacks. r=khuey (53f3868d3)
- Bug 1182980 - Part 8: Use nsTHashtable::Iterator in nsIDocument::EnumerateActivityObservers. r=khuey (868eef2c2)
- Bug 1182980 - Part 9: Use nsTHashtable::Iterator in rest of nsDocument. r=khuey (797b75fb8)
- Bug 1182980 - Part 10: Use nsTHashtable::Iterator in DisconnectEventTargetObjects. r=khuey (37aee02c8)
- Bug 1182980 - Part 11: Use nsTHashtable::Iterator in nsGlobalWindow::AddSizeOfIncludingThis. r=khuey (a75ffd411)
This commit is contained in:
2021-08-08 20:35:54 +08:00
parent c99a51f5f4
commit c171030101
20 changed files with 220 additions and 430 deletions
+6 -10
View File
@@ -1448,22 +1448,18 @@ FindOptimizableSubtreeRoot(nsINode* aNode)
StaticAutoPtr<nsTHashtable<nsPtrHashKey<nsINode>>> gCCBlackMarkedNodes;
static PLDHashOperator
VisitBlackMarkedNode(nsPtrHashKey<nsINode>* aEntry, void*)
{
nsINode* n = aEntry->GetKey();
n->SetCCMarkedRoot(false);
n->SetInCCBlackTree(false);
return PL_DHASH_NEXT;
}
static void
ClearBlackMarkedNodes()
{
if (!gCCBlackMarkedNodes) {
return;
}
gCCBlackMarkedNodes->EnumerateEntries(VisitBlackMarkedNode, nullptr);
for (auto iter = gCCBlackMarkedNodes->ConstIter(); !iter.Done();
iter.Next()) {
nsINode* n = iter.Get()->GetKey();
n->SetCCMarkedRoot(false);
n->SetInCCBlackTree(false);
}
gCCBlackMarkedNodes = nullptr;
}
+4 -10
View File
@@ -21,15 +21,6 @@
using namespace mozilla;
using namespace mozilla::dom;
static PLDHashOperator
IdentifierMapEntryTraverse(nsIdentifierMapEntry *aEntry, void *aArg)
{
nsCycleCollectionTraversalCallback *cb =
static_cast<nsCycleCollectionTraversalCallback*>(aArg);
aEntry->Traverse(cb);
return PL_DHASH_NEXT;
}
NS_IMPL_CYCLE_COLLECTION_CLASS(ShadowRoot)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(ShadowRoot,
@@ -39,7 +30,10 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(ShadowRoot,
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOlderShadow)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mYoungerShadow)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mAssociatedBinding)
tmp->mIdentifierMap.EnumerateEntries(IdentifierMapEntryTraverse, &cb);
for (auto iter = tmp->mIdentifierMap.ConstIter(); !iter.Done();
iter.Next()) {
iter.Get()->Traverse(&cb);
}
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(ShadowRoot,
+39 -87
View File
@@ -326,13 +326,6 @@ nsIdentifierMapEntry::RemoveContentChangeCallback(nsIDocument::IDTargetObserver
}
}
struct FireChangeArgs {
Element* mFrom;
Element* mTo;
bool mImageOnly;
bool mHaveImageOverride;
};
// XXX Workaround for bug 980560 to maintain the existing broken semantics
template<>
struct nsIStyleRule::COMTypeInfo<css::Rule, void> {
@@ -532,19 +525,6 @@ CustomElementData::RunCallbackQueue()
} // namespace dom
} // namespace mozilla
static PLDHashOperator
FireChangeEnumerator(nsIdentifierMapEntry::ChangeCallbackEntry *aEntry, void *aArg)
{
FireChangeArgs* args = static_cast<FireChangeArgs*>(aArg);
// Don't fire image changes for non-image observers, and don't fire element
// changes for image observers when an image override is active.
if (aEntry->mKey.mForImage ? (args->mHaveImageOverride && !args->mImageOnly) :
args->mImageOnly)
return PL_DHASH_NEXT;
return aEntry->mKey.mCallback(args->mFrom, args->mTo, aEntry->mKey.mData)
? PL_DHASH_NEXT : PL_DHASH_REMOVE;
}
void
nsIdentifierMapEntry::FireChangeCallbacks(Element* aOldElement,
Element* aNewElement,
@@ -553,8 +533,18 @@ nsIdentifierMapEntry::FireChangeCallbacks(Element* aOldElement,
if (!mChangeCallbacks)
return;
FireChangeArgs args = { aOldElement, aNewElement, aImageOnly, !!mImageElement };
mChangeCallbacks->EnumerateEntries(FireChangeEnumerator, &args);
for (auto iter = mChangeCallbacks->ConstIter(); !iter.Done(); iter.Next()) {
nsIdentifierMapEntry::ChangeCallbackEntry* entry = iter.Get();
// Don't fire image changes for non-image observers, and don't fire element
// changes for image observers when an image override is active.
if (entry->mKey.mForImage ? (mImageElement && !aImageOnly) : aImageOnly) {
continue;
}
if (!entry->mKey.mCallback(aOldElement, aNewElement, entry->mKey.mData)) {
iter.Remove();
}
}
}
namespace {
@@ -1871,15 +1861,6 @@ BoxObjectTraverser(nsIContent* key, nsPIBoxObject* boxObject, void* userArg)
return PL_DHASH_NEXT;
}
static PLDHashOperator
IdentifierMapEntryTraverse(nsIdentifierMapEntry *aEntry, void *aArg)
{
nsCycleCollectionTraversalCallback *cb =
static_cast<nsCycleCollectionTraversalCallback*>(aArg);
aEntry->Traverse(cb);
return PL_DHASH_NEXT;
}
static const char* kNSURIs[] = {
"([none])",
"(xmlns)",
@@ -1928,7 +1909,10 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(nsDocument)
return NS_SUCCESS_INTERRUPTED_TRAVERSE;
}
tmp->mIdentifierMap.EnumerateEntries(IdentifierMapEntryTraverse, &cb);
for (auto iter = tmp->mIdentifierMap.ConstIter(); !iter.Done();
iter.Next()) {
iter.Get()->Traverse(&cb);
}
tmp->mExternalResourceMap.Traverse(&cb);
@@ -9482,15 +9466,6 @@ nsDocument::DestroyElementMaps()
++mExpandoAndGeneration.generation;
}
static
PLDHashOperator
EnumerateStyledLinks(nsPtrHashKey<Link>* aEntry, void* aArray)
{
LinkArray* array = static_cast<LinkArray*>(aArray);
(void)array->AppendElement(aEntry->GetKey());
return PL_DHASH_NEXT;
}
void
nsDocument::RefreshLinkHrefs()
{
@@ -9498,7 +9473,9 @@ nsDocument::RefreshLinkHrefs()
// remove them from the document, so we need a copy of what is in the
// hashtable.
LinkArray linksToNotify(mStyledLinks.Count());
(void)mStyledLinks.EnumerateEntries(EnumerateStyledLinks, &linksToNotify);
for (auto iter = mStyledLinks.ConstIter(); !iter.Done(); iter.Next()) {
linksToNotify.AppendElement(iter.Get()->GetKey());
}
// Reset all of our styled links.
nsAutoScriptBlocker scriptBlocker;
@@ -10199,27 +10176,17 @@ nsIDocument::UnregisterActivityObserver(nsISupports* aSupports)
return true;
}
struct EnumerateActivityObserversData {
nsIDocument::ActivityObserverEnumerator mEnumerator;
void* mData;
};
static PLDHashOperator
EnumerateObservers(nsPtrHashKey<nsISupports>* aEntry, void* aData)
{
EnumerateActivityObserversData* data = static_cast<EnumerateActivityObserversData*>(aData);
data->mEnumerator(aEntry->GetKey(), data->mData);
return PL_DHASH_NEXT;
}
void
nsIDocument::EnumerateActivityObservers(ActivityObserverEnumerator aEnumerator,
void* aData)
{
if (!mActivityObservers)
return;
EnumerateActivityObserversData data = { aEnumerator, aData };
mActivityObservers->EnumerateEntries(EnumerateObservers, &data);
for (auto iter = mActivityObservers->ConstIter(); !iter.Done();
iter.Next()) {
aEnumerator(iter.Get()->GetKey(), aData);
}
}
void
@@ -10240,13 +10207,6 @@ nsIDocument::UnregisterPendingLinkUpdate(Link* aLink)
mLinksToUpdate.RemoveEntry(aLink);
}
static PLDHashOperator
EnumeratePendingLinkUpdates(nsPtrHashKey<Link>* aEntry, void* aData)
{
aEntry->GetKey()->GetElement()->UpdateLinkState(aEntry->GetKey()->LinkState());
return PL_DHASH_NEXT;
}
void
nsIDocument::FlushPendingLinkUpdates()
{
@@ -10258,7 +10218,10 @@ nsIDocument::FlushPendingLinkUpdates()
AutoRestore<bool> saved(mIsLinkUpdateRegistrationsForbidden);
mIsLinkUpdateRegistrationsForbidden = true;
#endif
mLinksToUpdate.EnumerateEntries(EnumeratePendingLinkUpdates, nullptr);
for (auto iter = mLinksToUpdate.ConstIter(); !iter.Done(); iter.Next()) {
Link* link = iter.Get()->GetKey();
link->GetElement()->UpdateLinkState(link->LinkState());
}
mLinksToUpdate.Clear();
mHasLinksToUpdate = false;
}
@@ -10631,21 +10594,13 @@ AllSubDocumentPluginEnum(nsIDocument* aDocument, void* userArg)
return true;
}
static PLDHashOperator
AllPluginEnum(nsPtrHashKey<nsIObjectLoadingContent>* aPlugin, void* userArg)
{
nsTArray<nsIObjectLoadingContent*>* allPlugins =
reinterpret_cast< nsTArray<nsIObjectLoadingContent*>* >(userArg);
MOZ_ASSERT(allPlugins);
allPlugins->AppendElement(aPlugin->GetKey());
return PL_DHASH_NEXT;
}
void
nsDocument::GetPlugins(nsTArray<nsIObjectLoadingContent*>& aPlugins)
{
aPlugins.SetCapacity(aPlugins.Length() + mPlugins.Count());
mPlugins.EnumerateEntries(AllPluginEnum, &aPlugins);
for (auto iter = mPlugins.ConstIter(); !iter.Done(); iter.Next()) {
aPlugins.AppendElement(iter.Get()->GetKey());
}
EnumerateSubDocuments(AllSubDocumentPluginEnum, &aPlugins);
}
@@ -10665,20 +10620,17 @@ nsDocument::RemoveResponsiveContent(nsIContent* aContent)
mResponsiveContent.RemoveEntry(aContent);
}
static PLDHashOperator
NotifyMediaFeatureEnum(nsPtrHashKey<nsIContent>* aContent, void* userArg)
{
nsCOMPtr<nsIContent> content = aContent->GetKey();
if (content->IsHTMLElement(nsGkAtoms::img)) {
static_cast<HTMLImageElement*>(content.get())->MediaFeatureValuesChanged();
}
return PL_DHASH_NEXT;
}
void
nsDocument::NotifyMediaFeatureValuesChanged()
{
mResponsiveContent.EnumerateEntries(NotifyMediaFeatureEnum, nullptr);
for (auto iter = mResponsiveContent.ConstIter(); !iter.Done();
iter.Next()) {
nsCOMPtr<nsIContent> content = iter.Get()->GetKey();
if (content->IsHTMLElement(nsGkAtoms::img)) {
auto* imageElement = static_cast<HTMLImageElement*>(content.get());
imageElement->MediaFeatureValuesChanged();
}
}
}
PLDHashOperator LockEnumerator(imgIRequest* aKey,
+26 -38
View File
@@ -1234,21 +1234,11 @@ nsGlobalWindow::Init()
sWindowsById = new WindowByIdTable();
}
static PLDHashOperator
DisconnectEventTargetObjects(nsPtrHashKey<DOMEventTargetHelper>* aKey,
void* aClosure)
{
nsRefPtr<DOMEventTargetHelper> target = aKey->GetKey();
target->DisconnectFromOwner();
return PL_DHASH_NEXT;
}
nsGlobalWindow::~nsGlobalWindow()
{
AssertIsOnMainThread();
mEventTargetObjects.EnumerateEntries(DisconnectEventTargetObjects, nullptr);
mEventTargetObjects.Clear();
DisconnectEventTargetObjects();
// We have to check if sWindowsById isn't null because ::Shutdown might have
// been called.
@@ -1359,6 +1349,17 @@ nsGlobalWindow::RemoveEventTargetObject(DOMEventTargetHelper* aObject)
mEventTargetObjects.RemoveEntry(aObject);
}
void
nsGlobalWindow::DisconnectEventTargetObjects()
{
for (auto iter = mEventTargetObjects.ConstIter(); !iter.Done();
iter.Next()) {
nsRefPtr<DOMEventTargetHelper> target = iter.Get()->GetKey();
target->DisconnectFromOwner();
}
mEventTargetObjects.Clear();
}
// static
void
nsGlobalWindow::ShutDown()
@@ -1418,8 +1419,7 @@ nsGlobalWindow::CleanUp()
StartDying();
mEventTargetObjects.EnumerateEntries(DisconnectEventTargetObjects, nullptr);
mEventTargetObjects.Clear();
DisconnectEventTargetObjects();
if (mObserver) {
nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
@@ -13345,27 +13345,6 @@ nsGlobalWindow::DisableTimeChangeNotifications()
mozilla::time::RemoveWindowListener(this);
}
static PLDHashOperator
CollectSizeAndListenerCount(
nsPtrHashKey<DOMEventTargetHelper>* aEntry,
void *arg)
{
nsWindowSizes* windowSizes = static_cast<nsWindowSizes*>(arg);
DOMEventTargetHelper* et = aEntry->GetKey();
if (nsCOMPtr<nsISizeOfEventTarget> iSizeOf = do_QueryObject(et)) {
windowSizes->mDOMEventTargetsSize +=
iSizeOf->SizeOfEventTargetIncludingThis(windowSizes->mMallocSizeOf);
}
if (EventListenerManager* elm = et->GetExistingListenerManager()) {
windowSizes->mDOMEventListenersCount += elm->ListenerCount();
}
return PL_DHASH_NEXT;
}
void
nsGlobalWindow::AddSizeOfIncludingThis(nsWindowSizes* aWindowSizes) const
{
@@ -13399,10 +13378,19 @@ nsGlobalWindow::AddSizeOfIncludingThis(nsWindowSizes* aWindowSizes) const
aWindowSizes->mDOMEventTargetsSize +=
mEventTargetObjects.SizeOfExcludingThis(nullptr,
aWindowSizes->mMallocSizeOf);
aWindowSizes->mDOMEventTargetsCount +=
const_cast<nsTHashtable<nsPtrHashKey<DOMEventTargetHelper> >*>
(&mEventTargetObjects)->EnumerateEntries(CollectSizeAndListenerCount,
aWindowSizes);
for (auto iter = mEventTargetObjects.ConstIter(); !iter.Done(); iter.Next()) {
DOMEventTargetHelper* et = iter.Get()->GetKey();
if (nsCOMPtr<nsISizeOfEventTarget> iSizeOf = do_QueryObject(et)) {
aWindowSizes->mDOMEventTargetsSize +=
iSizeOf->SizeOfEventTargetIncludingThis(aWindowSizes->mMallocSizeOf);
}
if (EventListenerManager* elm = et->GetExistingListenerManager()) {
aWindowSizes->mDOMEventListenersCount += elm->ListenerCount();
}
++aWindowSizes->mDOMEventTargetsCount;
}
}
+2
View File
@@ -1613,6 +1613,8 @@ private:
// Fire the JS engine's onNewGlobalObject hook. Only used on inner windows.
void FireOnNewGlobalObject();
void DisconnectEventTargetObjects();
protected:
// This member is also used on both inner and outer windows, but
// for slightly different purposes. On inner windows it means the
+15 -34
View File
@@ -139,36 +139,6 @@ nsRange::CompareNodeToRange(nsINode* aNode, nsRange* aRange,
return NS_OK;
}
struct FindSelectedRangeData
{
nsINode* mNode;
nsRange* mResult;
uint32_t mStartOffset;
uint32_t mEndOffset;
};
static PLDHashOperator
FindSelectedRange(nsPtrHashKey<nsRange>* aEntry, void* userArg)
{
nsRange* range = aEntry->GetKey();
if (range->IsInSelection() && !range->Collapsed()) {
FindSelectedRangeData* data = static_cast<FindSelectedRangeData*>(userArg);
int32_t cmp = nsContentUtils::ComparePoints(data->mNode, data->mEndOffset,
range->GetStartParent(),
range->StartOffset());
if (cmp == 1) {
cmp = nsContentUtils::ComparePoints(data->mNode, data->mStartOffset,
range->GetEndParent(),
range->EndOffset());
if (cmp == -1) {
data->mResult = range;
return PL_DHASH_STOP;
}
}
}
return PL_DHASH_NEXT;
}
static nsINode*
GetNextRangeCommonAncestor(nsINode* aNode)
{
@@ -187,16 +157,27 @@ nsRange::IsNodeSelected(nsINode* aNode, uint32_t aStartOffset,
{
NS_PRECONDITION(aNode, "bad arg");
FindSelectedRangeData data = { aNode, nullptr, aStartOffset, aEndOffset };
nsINode* n = GetNextRangeCommonAncestor(aNode);
NS_ASSERTION(n || !aNode->IsSelectionDescendant(),
"orphan selection descendant");
for (; n; n = GetNextRangeCommonAncestor(n->GetParentNode())) {
RangeHashTable* ranges =
static_cast<RangeHashTable*>(n->GetProperty(nsGkAtoms::range));
ranges->EnumerateEntries(FindSelectedRange, &data);
if (data.mResult) {
return true;
for (auto iter = ranges->ConstIter(); !iter.Done(); iter.Next()) {
nsRange* range = iter.Get()->GetKey();
if (range->IsInSelection() && !range->Collapsed()) {
int32_t cmp = nsContentUtils::ComparePoints(aNode, aEndOffset,
range->GetStartParent(),
range->StartOffset());
if (cmp == 1) {
cmp = nsContentUtils::ComparePoints(aNode, aStartOffset,
range->GetEndParent(),
range->EndOffset());
if (cmp == -1) {
return true;
}
}
}
}
}
return false;
+43 -70
View File
@@ -457,53 +457,6 @@ GetWindows(const uint64_t& aId, nsGlobalWindow*& aWindow, void* aClosure)
return PL_DHASH_NEXT;
}
struct ReportGhostWindowsEnumeratorData
{
nsIMemoryReporterCallback* mCallback;
nsISupports* mData;
bool mAnonymize;
nsresult mRv;
};
static PLDHashOperator
ReportGhostWindowsEnumerator(nsUint64HashKey* aIDHashKey, void* aData)
{
ReportGhostWindowsEnumeratorData *data =
static_cast<ReportGhostWindowsEnumeratorData*>(aData);
nsGlobalWindow::WindowByIdTable* windowsById =
nsGlobalWindow::GetWindowsTable();
if (!windowsById) {
NS_WARNING("Couldn't get window-by-id hashtable?");
return PL_DHASH_NEXT;
}
nsGlobalWindow* window = windowsById->Get(aIDHashKey->GetKey());
if (!window) {
NS_WARNING("Could not look up window?");
return PL_DHASH_NEXT;
}
nsAutoCString path;
path.AppendLiteral("ghost-windows/");
AppendWindowURI(window, path, data->mAnonymize);
nsresult rv = data->mCallback->Callback(
/* process = */ EmptyCString(),
path,
nsIMemoryReporter::KIND_OTHER,
nsIMemoryReporter::UNITS_COUNT,
/* amount = */ 1,
/* description = */ NS_LITERAL_CSTRING("A ghost window."),
data->mData);
if (NS_FAILED(rv) && NS_SUCCEEDED(data->mRv)) {
data->mRv = rv;
}
return PL_DHASH_NEXT;
}
NS_IMETHODIMP
nsWindowMemoryReporter::CollectReports(nsIMemoryReporterCallback* aCb,
nsISupports* aClosure, bool aAnonymize)
@@ -521,11 +474,37 @@ nsWindowMemoryReporter::CollectReports(nsIMemoryReporterCallback* aCb,
// one.
nsTHashtable<nsUint64HashKey> ghostWindows;
CheckForGhostWindows(&ghostWindows);
ReportGhostWindowsEnumeratorData reportGhostWindowsEnumData =
{ aCb, aClosure, aAnonymize, NS_OK };
ghostWindows.EnumerateEntries(ReportGhostWindowsEnumerator,
&reportGhostWindowsEnumData);
nsresult rv = reportGhostWindowsEnumData.mRv;
nsresult rv = NS_OK;
for (auto iter = ghostWindows.ConstIter(); !iter.Done(); iter.Next()) {
nsGlobalWindow::WindowByIdTable* windowsById =
nsGlobalWindow::GetWindowsTable();
if (!windowsById) {
NS_WARNING("Couldn't get window-by-id hashtable?");
continue;
}
nsGlobalWindow* window = windowsById->Get(iter.Get()->GetKey());
if (!window) {
NS_WARNING("Could not look up window?");
continue;
}
nsAutoCString path;
path.AppendLiteral("ghost-windows/");
AppendWindowURI(window, path, aAnonymize);
nsresult callbackRv = aCb->Callback(
/* process = */ EmptyCString(),
path,
nsIMemoryReporter::KIND_OTHER,
nsIMemoryReporter::UNITS_COUNT,
/* amount = */ 1,
/* description = */ NS_LITERAL_CSTRING("A ghost window."),
aClosure);
if (NS_FAILED(callbackRv) && NS_SUCCEEDED(rv)) {
rv = callbackRv;
}
}
NS_ENSURE_SUCCESS(rv, rv);
WindowPaths windowPaths;
@@ -921,23 +900,6 @@ nsWindowMemoryReporter::KillCheckTimer()
}
#ifdef DEBUG
static PLDHashOperator
UnlinkGhostWindowsEnumerator(nsUint64HashKey* aIDHashKey, void *)
{
nsGlobalWindow::WindowByIdTable* windowsById =
nsGlobalWindow::GetWindowsTable();
if (!windowsById) {
return PL_DHASH_NEXT;
}
nsRefPtr<nsGlobalWindow> window = windowsById->Get(aIDHashKey->GetKey());
if (window) {
window->RiskyUnlink();
}
return PL_DHASH_NEXT;
}
/* static */ void
nsWindowMemoryReporter::UnlinkGhostWindows()
{
@@ -959,6 +921,17 @@ nsWindowMemoryReporter::UnlinkGhostWindows()
// Get the IDs of all the "ghost" windows, and unlink them all.
nsTHashtable<nsUint64HashKey> ghostWindows;
sWindowReporter->CheckForGhostWindows(&ghostWindows);
ghostWindows.EnumerateEntries(UnlinkGhostWindowsEnumerator, nullptr);
for (auto iter = ghostWindows.ConstIter(); !iter.Done(); iter.Next()) {
nsGlobalWindow::WindowByIdTable* windowsById =
nsGlobalWindow::GetWindowsTable();
if (!windowsById) {
continue;
}
nsRefPtr<nsGlobalWindow> window = windowsById->Get(iter.Get()->GetKey());
if (window) {
window->RiskyUnlink();
}
}
}
#endif
+6 -14
View File
@@ -400,26 +400,18 @@ nsWindowRoot::RemoveBrowser(mozilla::dom::TabParent* aBrowser)
mWeakBrowsers.RemoveEntry(weakBrowser);
}
static PLDHashOperator
WeakBrowserEnumFunc(nsRefPtrHashKey<nsIWeakReference>* aKey, void* aArg)
{
nsTArray<nsRefPtr<TabParent>>* tabParents =
static_cast<nsTArray<nsRefPtr<TabParent>>*>(aArg);
nsCOMPtr<nsITabParent> tabParent(do_QueryReferent((*aKey).GetKey()));
TabParent* tab = TabParent::GetFrom(tabParent);
if (tab) {
tabParents->AppendElement(tab);
}
return PL_DHASH_NEXT;
}
void
nsWindowRoot::EnumerateBrowsers(BrowserEnumerator aEnumFunc, void* aArg)
{
// Collect strong references to all browsers in a separate array in
// case aEnumFunc alters mWeakBrowsers.
nsTArray<nsRefPtr<TabParent>> tabParents;
mWeakBrowsers.EnumerateEntries(WeakBrowserEnumFunc, &tabParents);
for (auto iter = mWeakBrowsers.ConstIter(); !iter.Done(); iter.Next()) {
nsCOMPtr<nsITabParent> tabParent(do_QueryReferent(iter.Get()->GetKey()));
if (TabParent* tab = TabParent::GetFrom(tabParent)) {
tabParents.AppendElement(tab);
}
}
for (uint32_t i = 0; i < tabParents.Length(); ++i) {
aEnumFunc(tabParents[i], aArg);
+2 -14
View File
@@ -28,11 +28,11 @@ DataContainerEvent::DataContainerEvent(EventTarget* aOwner,
NS_IMPL_CYCLE_COLLECTION_CLASS(DataContainerEvent)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(DataContainerEvent, Event)
tmp->mData.Clear();
NS_IMPL_CYCLE_COLLECTION_UNLINK(mData)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(DataContainerEvent, Event)
tmp->mData.EnumerateRead(TraverseEntry, &cb);
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mData)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_ADDREF_INHERITED(DataContainerEvent, Event)
@@ -81,18 +81,6 @@ DataContainerEvent::SetData(JSContext* aCx, const nsAString& aKey,
aRv = SetData(aKey, val);
}
PLDHashOperator
DataContainerEvent::TraverseEntry(const nsAString& aKey,
nsIVariant* aDataItem,
void* aUserArg)
{
nsCycleCollectionTraversalCallback *cb =
static_cast<nsCycleCollectionTraversalCallback*>(aUserArg);
cb->NoteXPCOMChild(aDataItem);
return PL_DHASH_NEXT;
}
} // namespace dom
} // namespace mozilla
-3
View File
@@ -51,9 +51,6 @@ protected:
~DataContainerEvent() {}
private:
static PLDHashOperator
TraverseEntry(const nsAString& aKey, nsIVariant* aDataItem, void* aUserArg);
nsInterfaceHashtable<nsStringHashKey, nsIVariant> mData;
};
+4 -8
View File
@@ -100,13 +100,6 @@ MediaShutdownManager::Observe(nsISupports *aSubjet,
return NS_OK;
}
static PLDHashOperator
ShutdownMediaDecoder(nsRefPtrHashKey<MediaDecoder>* aEntry, void*)
{
aEntry->GetKey()->Shutdown();
return PL_DHASH_REMOVE;
}
void
MediaShutdownManager::Shutdown()
{
@@ -122,7 +115,10 @@ MediaShutdownManager::Shutdown()
// Iterate over the decoders and shut them down, and remove them from the
// hashtable.
mDecoders.EnumerateEntries(ShutdownMediaDecoder, nullptr);
for (auto iter = mDecoders.Iter(); !iter.Done(); iter.Next()) {
iter.Get()->GetKey()->Shutdown();
iter.Remove();
}
// Ensure all media shared thread pools are shutdown. This joins with all
// threads in the state machine thread pool, the decoder thread pool, and
+7 -11
View File
@@ -70,21 +70,17 @@ GMPTimerParent::Shutdown()
LOGD(("%s::%s: %p mIsOpen=%d", __CLASS__, __FUNCTION__, this, mIsOpen));
MOZ_ASSERT(mGMPThread == NS_GetCurrentThread());
mTimers.EnumerateEntries(GMPTimerParent::CancelTimers, nullptr);
for (auto iter = mTimers.Iter(); !iter.Done(); iter.Next()) {
Context* context = iter.Get()->GetKey();
context->mTimer->Cancel();
delete context;
}
mTimers.Clear();
mIsOpen = false;
}
/*static */
PLDHashOperator
GMPTimerParent::CancelTimers(nsPtrHashKey<Context>* aContext, void* aClosure)
{
auto context = aContext->GetKey();
context->mTimer->Cancel();
delete context;
return PL_DHASH_NEXT;
}
void
GMPTimerParent::ActorDestroy(ActorDestroyReason aWhy)
{
-3
View File
@@ -47,9 +47,6 @@ private:
uint32_t mId;
};
static PLDHashOperator
CancelTimers(nsPtrHashKey<Context>* aContext, void* aClosure);
void TimerExpired(Context* aContext);
nsTHashtable<nsPtrHashKey<Context>> mTimers;
+38 -35
View File
@@ -3797,39 +3797,6 @@ PluginInstanceChild::AsyncCall(PluginThreadCallback aFunc, void* aUserData)
ProcessChild::message_loop()->PostTask(FROM_HERE, task);
}
static PLDHashOperator
InvalidateObject(DeletingObjectEntry* e, void* userArg)
{
NPObject* o = e->GetKey();
if (!e->mDeleted && o->_class && o->_class->invalidate)
o->_class->invalidate(o);
return PL_DHASH_NEXT;
}
static PLDHashOperator
DeleteObject(DeletingObjectEntry* e, void* userArg)
{
NPObject* o = e->GetKey();
if (!e->mDeleted) {
e->mDeleted = true;
#ifdef NS_BUILD_REFCNT_LOGGING
{
int32_t refcnt = o->referenceCount;
while (refcnt) {
--refcnt;
NS_LOG_RELEASE(o, refcnt, "NPObject");
}
}
#endif
PluginModuleChild::DeallocNPObject(o);
}
return PL_DHASH_NEXT;
}
void
PluginInstanceChild::SwapSurfaces()
{
@@ -3937,6 +3904,42 @@ PluginInstanceChild::ClearAllSurfaces()
#endif
}
static void
InvalidateObjects(nsTHashtable<DeletingObjectEntry>& aEntries)
{
for (auto iter = aEntries.Iter(); !iter.Done(); iter.Next()) {
DeletingObjectEntry* e = iter.Get();
NPObject* o = e->GetKey();
if (!e->mDeleted && o->_class && o->_class->invalidate) {
o->_class->invalidate(o);
}
}
}
static void
DeleteObjects(nsTHashtable<DeletingObjectEntry>& aEntries)
{
for (auto iter = aEntries.Iter(); !iter.Done(); iter.Next()) {
DeletingObjectEntry* e = iter.Get();
NPObject* o = e->GetKey();
if (!e->mDeleted) {
e->mDeleted = true;
#ifdef NS_BUILD_REFCNT_LOGGING
{
int32_t refcnt = o->referenceCount;
while (refcnt) {
--refcnt;
NS_LOG_RELEASE(o, refcnt, "NPObject");
}
}
#endif
PluginModuleChild::DeallocNPObject(o);
}
}
}
void
PluginInstanceChild::Destroy()
{
@@ -3991,8 +3994,8 @@ PluginInstanceChild::Destroy()
mDeletingHash = new nsTHashtable<DeletingObjectEntry>;
PluginScriptableObjectChild::NotifyOfInstanceShutdown(this);
mDeletingHash->EnumerateEntries(InvalidateObject, nullptr);
mDeletingHash->EnumerateEntries(DeleteObject, nullptr);
InvalidateObjects(*mDeletingHash);
DeleteObjects(*mDeletingHash);
// Null out our cached actors as they should have been killed in the
// PluginInstanceDestroyed call above.
+10 -13
View File
@@ -1266,22 +1266,19 @@ PluginScriptableObjectChild::GetInstanceForNPObject(NPObject* aObject)
return d->instance;
}
/* static */ PLDHashOperator
PluginScriptableObjectChild::CollectForInstance(NPObjectData* d, void* userArg)
{
PluginInstanceChild* instance = static_cast<PluginInstanceChild*>(userArg);
if (d->instance == instance) {
NPObject* o = d->GetKey();
instance->mDeletingHash->PutEntry(o);
}
return PL_DHASH_NEXT;
}
/* static */ void
PluginScriptableObjectChild::NotifyOfInstanceShutdown(PluginInstanceChild* aInstance)
{
AssertPluginThread();
if (sObjectMap) {
sObjectMap->EnumerateEntries(CollectForInstance, aInstance);
if (!sObjectMap) {
return;
}
for (auto iter = sObjectMap->Iter(); !iter.Done(); iter.Next()) {
NPObjectData* d = iter.Get();
if (d->instance == aInstance) {
NPObject* o = d->GetKey();
aInstance->mDeletingHash->PutEntry(o);
}
}
}
@@ -329,8 +329,6 @@ private:
PluginScriptableObjectChild* actor;
};
static PLDHashOperator CollectForInstance(NPObjectData* d, void* userArg);
/**
* mObjectMap contains all the currently active NPObjects (from NPN_CreateObject until the
* final release/dealloc, whether or not an actor is currently associated with the object.
+12 -35
View File
@@ -39,42 +39,14 @@ using namespace mozilla::dom;
static const char kXBLCachePrefix[] = "xblcache";
/* Implementation file */
static PLDHashOperator
TraverseProtos(const nsACString &aKey, nsXBLPrototypeBinding *aProto, void* aClosure)
{
nsCycleCollectionTraversalCallback *cb =
static_cast<nsCycleCollectionTraversalCallback*>(aClosure);
aProto->Traverse(*cb);
return PL_DHASH_NEXT;
}
static PLDHashOperator
UnlinkProto(const nsACString &aKey, nsXBLPrototypeBinding *aProto, void* aClosure)
{
aProto->Unlink();
return PL_DHASH_NEXT;
}
struct ProtoTracer
{
const TraceCallbacks &mCallbacks;
void *mClosure;
};
static PLDHashOperator
TraceProtos(const nsACString &aKey, nsXBLPrototypeBinding *aProto, void* aClosure)
{
ProtoTracer* closure = static_cast<ProtoTracer*>(aClosure);
aProto->Trace(closure->mCallbacks, closure->mClosure);
return PL_DHASH_NEXT;
}
NS_IMPL_CYCLE_COLLECTION_CLASS(nsXBLDocumentInfo)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsXBLDocumentInfo)
if (tmp->mBindingTable) {
tmp->mBindingTable->EnumerateRead(UnlinkProto, nullptr);
for (auto iter = tmp->mBindingTable->ConstIter();
!iter.Done(); iter.Next()) {
iter.UserData()->Unlink();
}
}
NS_IMPL_CYCLE_COLLECTION_UNLINK(mDocument)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
@@ -86,14 +58,19 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsXBLDocumentInfo)
}
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDocument)
if (tmp->mBindingTable) {
tmp->mBindingTable->EnumerateRead(TraverseProtos, &cb);
for (auto iter = tmp->mBindingTable->ConstIter();
!iter.Done(); iter.Next()) {
iter.UserData()->Traverse(cb);
}
}
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsXBLDocumentInfo)
if (tmp->mBindingTable) {
ProtoTracer closure = { aCallbacks, aClosure };
tmp->mBindingTable->EnumerateRead(TraceProtos, &closure);
for (auto iter = tmp->mBindingTable->ConstIter();
!iter.Done(); iter.Next()) {
iter.UserData()->Trace(aCallbacks, aClosure);
}
}
NS_IMPL_CYCLE_COLLECTION_TRACE_END
-35
View File
@@ -343,41 +343,6 @@ protected:
void* aArg);
};
class nsCycleCollectionTraversalCallback;
struct MOZ_STACK_CLASS nsBaseHashtableCCTraversalData
{
nsBaseHashtableCCTraversalData(nsCycleCollectionTraversalCallback& aCallback,
const char* aName,
uint32_t aFlags)
: mCallback(aCallback)
, mName(aName)
, mFlags(aFlags)
{
}
nsCycleCollectionTraversalCallback& mCallback;
const char* mName;
uint32_t mFlags;
};
template<typename K, typename T>
PLDHashOperator
ImplCycleCollectionTraverse_EnumFunc(K aKey,
T aData,
void* aUserData)
{
nsBaseHashtableCCTraversalData* userData =
static_cast<nsBaseHashtableCCTraversalData*>(aUserData);
CycleCollectionNoteChild(userData->mCallback,
aData,
userData->mName,
userData->mFlags);
return PL_DHASH_NEXT;
}
//
// nsBaseHashtableET definitions
//
+3 -4
View File
@@ -69,10 +69,9 @@ ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
const char* aName,
uint32_t aFlags = 0)
{
nsBaseHashtableCCTraversalData userData(aCallback, aName, aFlags);
aField.EnumerateRead(ImplCycleCollectionTraverse_EnumFunc<typename K::KeyType, T*>,
&userData);
for (auto iter = aField.ConstIter(); !iter.Done(); iter.Next()) {
CycleCollectionNoteChild(aCallback, iter.UserData(), aName, aFlags);
}
}
//
+3 -4
View File
@@ -84,10 +84,9 @@ ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
const char* aName,
uint32_t aFlags = 0)
{
nsBaseHashtableCCTraversalData userData(aCallback, aName, aFlags);
aField.EnumerateRead(ImplCycleCollectionTraverse_EnumFunc<typename K::KeyType, T*>,
&userData);
for (auto iter = aField.ConstIter(); !iter.Done(); iter.Next()) {
CycleCollectionNoteChild(aCallback, iter.UserData(), aName, aFlags);
}
}
//