From ed2b9640bf1741c7fb46431d16abd48041e7cdbb Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Fri, 23 Mar 2012 17:04:28 -0400 Subject: [PATCH] Backout 1152d14294df, 18c70ab50559, dbd51616925a, 730c2e84247f, and 7beb8fd46629 due to perma-hangs on WinXP debug moth. (test_memoryReporters.xul | application timed out after 330 seconds with no output) --- gfx/thebes/gfxDWriteFontList.cpp | 75 +--------- gfx/thebes/gfxDWriteFontList.h | 17 +-- gfx/thebes/gfxDWriteFonts.cpp | 17 --- gfx/thebes/gfxDWriteFonts.h | 5 - gfx/thebes/gfxFT2FontList.cpp | 17 --- gfx/thebes/gfxFT2FontList.h | 5 - gfx/thebes/gfxFT2Fonts.cpp | 17 --- gfx/thebes/gfxFT2Fonts.h | 5 - gfx/thebes/gfxFont.cpp | 216 ++------------------------- gfx/thebes/gfxFont.h | 65 +------- gfx/thebes/gfxFontUtils.h | 16 +- gfx/thebes/gfxGDIFont.cpp | 17 --- gfx/thebes/gfxGDIFont.h | 5 - gfx/thebes/gfxGDIFontList.cpp | 46 +----- gfx/thebes/gfxGDIFontList.h | 10 +- gfx/thebes/gfxMacFont.cpp | 16 -- gfx/thebes/gfxMacFont.h | 5 - gfx/thebes/gfxMacPlatformFontList.h | 6 - gfx/thebes/gfxMacPlatformFontList.mm | 25 +--- gfx/thebes/gfxPlatformFontList.cpp | 185 ++--------------------- gfx/thebes/gfxPlatformFontList.h | 33 ---- xpcom/glue/nsBaseHashtable.h | 15 +- xpcom/glue/nsTHashtable.h | 7 +- 23 files changed, 66 insertions(+), 759 deletions(-) diff --git a/gfx/thebes/gfxDWriteFontList.cpp b/gfx/thebes/gfxDWriteFontList.cpp index 61077420fa2..0cdf0b1bc0a 100644 --- a/gfx/thebes/gfxDWriteFontList.cpp +++ b/gfx/thebes/gfxDWriteFontList.cpp @@ -249,23 +249,6 @@ gfxDWriteFontFamily::LocalizedName(nsAString &aLocalizedName) aLocalizedName = nsDependentString(famName.Elements()); } -void -gfxDWriteFontFamily::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - gfxFontFamily::SizeOfExcludingThis(aMallocSizeOf, aSizes); - // TODO: - // This doesn't currently account for |mDWFamily| -} - -void -gfxDWriteFontFamily::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - aSizes->mFontListSize += aMallocSizeOf(this); - SizeOfExcludingThis(aMallocSizeOf, aSizes); -} - //////////////////////////////////////////////////////////////////////////////// // gfxDWriteFontEntry @@ -394,8 +377,7 @@ gfxDWriteFontEntry::ReadCMAP() unicodeFont, symbolFont); #ifdef PR_LOGGING LOG_FONTLIST(("(fontlist-cmap) name: %s, size: %d\n", - NS_ConvertUTF16toUTF8(mName).get(), - mCharacterMap.SizeOfExcludingThis(moz_malloc_size_of))); + NS_ConvertUTF16toUTF8(mName).get(), mCharacterMap.GetSize())); if (LOG_CMAPDATA_ENABLED()) { char prefix[256]; sprintf(prefix, "(cmapdata) name: %.220s", @@ -442,8 +424,7 @@ gfxDWriteFontEntry::ReadCMAP() #ifdef PR_LOGGING LOG_FONTLIST(("(fontlist-cmap) name: %s, size: %d\n", - NS_ConvertUTF16toUTF8(mName).get(), - mCharacterMap.SizeOfExcludingThis(moz_malloc_size_of))); + NS_ConvertUTF16toUTF8(mName).get(), mCharacterMap.GetSize())); if (LOG_CMAPDATA_ENABLED()) { char prefix[256]; sprintf(prefix, "(cmapdata) name: %.220s", @@ -563,23 +544,6 @@ gfxDWriteFontEntry::IsCJKFont() return mIsCJK; } -void -gfxDWriteFontEntry::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - gfxFontEntry::SizeOfExcludingThis(aMallocSizeOf, aSizes); - // TODO: - // This doesn't currently account for the |mFont| and |mFontFile| members -} - -void -gfxDWriteFontEntry::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - aSizes->mFontListSize += aMallocSizeOf(this); - SizeOfExcludingThis(aMallocSizeOf, aSizes); -} - //////////////////////////////////////////////////////////////////////////////// // gfxDWriteFontList @@ -623,6 +587,7 @@ gfxFontEntry * gfxDWriteFontList::LookupLocalFont(const gfxProxyFontEntry *aProxyEntry, const nsAString& aFullname) { + bool found; gfxFontEntry *lookup; // initialize name lookup tables if needed @@ -631,8 +596,8 @@ gfxDWriteFontList::LookupLocalFont(const gfxProxyFontEntry *aProxyEntry, } // lookup in name lookup tables, return null if not found - if (!(lookup = mPostscriptNames.GetWeak(aFullname)) && - !(lookup = mFullnames.GetWeak(aFullname))) + if (!(lookup = mPostscriptNames.GetWeak(aFullname, &found)) && + !(lookup = mFullnames.GetWeak(aFullname, &found))) { return nsnull; } @@ -1217,8 +1182,8 @@ gfxDWriteFontList::ResolveFontName(const nsAString& aFontName, nsAutoString keyName(aFontName); BuildKeyNameFromFontName(keyName); - gfxFontFamily *ff = mFontSubstitutes.GetWeak(keyName); - if (ff) { + nsRefPtr ff; + if (mFontSubstitutes.Get(keyName, &ff)) { aResolvedFontName = ff->Name(); return true; } @@ -1230,32 +1195,6 @@ gfxDWriteFontList::ResolveFontName(const nsAString& aFontName, return gfxPlatformFontList::ResolveFontName(aFontName, aResolvedFontName); } -void -gfxDWriteFontList::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - gfxPlatformFontList::SizeOfExcludingThis(aMallocSizeOf, aSizes); - - aSizes->mFontListSize += - mFontSubstitutes.SizeOfExcludingThis(SizeOfFamilyNameEntryExcludingThis, - aMallocSizeOf); - - aSizes->mFontListSize += - mNonExistingFonts.SizeOfExcludingThis(aMallocSizeOf); - for (PRUint32 i = 0; i < mNonExistingFonts.Length(); ++i) { - aSizes->mFontListSize += - mNonExistingFonts[i].SizeOfExcludingThisIfUnshared(aMallocSizeOf); - } -} - -void -gfxDWriteFontList::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - aSizes->mFontListSize += aMallocSizeOf(this); - SizeOfExcludingThis(aMallocSizeOf, aSizes); -} - static nsresult GetFamilyName(IDWriteFont *aFont, nsString& aFamilyName) { HRESULT hr; diff --git a/gfx/thebes/gfxDWriteFontList.h b/gfx/thebes/gfxDWriteFontList.h index 5287402cd24..c1db3f0456f 100644 --- a/gfx/thebes/gfxDWriteFontList.h +++ b/gfx/thebes/gfxDWriteFontList.h @@ -79,11 +79,6 @@ public: void SetForceGDIClassic(bool aForce) { mForceGDIClassic = aForce; } - virtual void SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - virtual void SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - protected: /** This font family's directwrite fontfamily object */ nsRefPtr mDWFamily; @@ -184,11 +179,6 @@ public: void SetForceGDIClassic(bool aForce) { mForceGDIClassic = aForce; } bool GetForceGDIClassic() { return mForceGDIClassic; } - virtual void SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - virtual void SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - protected: friend class gfxDWriteFont; friend class gfxDWriteFontList; @@ -390,11 +380,6 @@ public: gfxFloat GetForceGDIClassicMaxFontSize() { return mForceGDIClassicMaxFontSize; } - virtual void SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - virtual void SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - private: friend class gfxDWriteFontFamily; @@ -416,7 +401,7 @@ private: */ nsTArray mNonExistingFonts; - typedef nsRefPtrHashtable FontTable; + typedef nsDataHashtable > FontTable; /** * Table of font substitutes, we grab this from the registry to get diff --git a/gfx/thebes/gfxDWriteFonts.cpp b/gfx/thebes/gfxDWriteFonts.cpp index 48d35cce001..b5e9beb8231 100644 --- a/gfx/thebes/gfxDWriteFonts.cpp +++ b/gfx/thebes/gfxDWriteFonts.cpp @@ -762,20 +762,3 @@ gfxDWriteFont::MeasureGlyphWidth(PRUint16 aGlyph) } return 0; } - -void -gfxDWriteFont::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const -{ - gfxFont::SizeOfExcludingThis(aMallocSizeOf, aSizes); - aSizes->mFontInstances += aMallocSizeOf(mMetrics) + - mGlyphWidths.SizeOfExcludingThis(nsnull, aMallocSizeOf); -} - -void -gfxDWriteFont::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const -{ - aSizes->mFontInstances += aMallocSizeOf(this); - SizeOfExcludingThis(aMallocSizeOf, aSizes); -} diff --git a/gfx/thebes/gfxDWriteFonts.h b/gfx/thebes/gfxDWriteFonts.h index 135903ae91d..0338776f8dc 100644 --- a/gfx/thebes/gfxDWriteFonts.h +++ b/gfx/thebes/gfxDWriteFonts.h @@ -92,11 +92,6 @@ public: virtual mozilla::TemporaryRef GetGlyphRenderingOptions(); - virtual void SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const; - virtual void SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const; - protected: friend class gfxDWriteShaper; diff --git a/gfx/thebes/gfxFT2FontList.cpp b/gfx/thebes/gfxFT2FontList.cpp index 82c1819f57d..9165207a106 100644 --- a/gfx/thebes/gfxFT2FontList.cpp +++ b/gfx/thebes/gfxFT2FontList.cpp @@ -389,23 +389,6 @@ FT2FontEntry::GetFontTable(PRUint32 aTableTag, return NS_OK; } -void -FT2FontEntry::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - gfxFontEntry::SizeOfExcludingThis(aMallocSizeOf, aSizes); - aSizes->mFontListSize += - mFilename.SizeOfExcludingThisIfUnshared(aMallocSizeOf); -} - -void -FT2FontEntry::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - aSizes->mFontListSize += aMallocSizeOf(this); - SizeOfExcludingThis(aMallocSizeOf, aSizes); -} - /* * FT2FontFamily * A standard gfxFontFamily; just adds a method used to support sending diff --git a/gfx/thebes/gfxFT2FontList.h b/gfx/thebes/gfxFT2FontList.h index 9299b9418ee..9d430c452c9 100644 --- a/gfx/thebes/gfxFT2FontList.h +++ b/gfx/thebes/gfxFT2FontList.h @@ -102,11 +102,6 @@ public: nsresult ReadCMAP(); nsresult GetFontTable(PRUint32 aTableTag, FallibleTArray& aBuffer); - virtual void SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - virtual void SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - FT_Face mFTFace; cairo_font_face_t *mFontFace; diff --git a/gfx/thebes/gfxFT2Fonts.cpp b/gfx/thebes/gfxFT2Fonts.cpp index f4e1d6cf27f..a2cd06e4080 100644 --- a/gfx/thebes/gfxFT2Fonts.cpp +++ b/gfx/thebes/gfxFT2Fonts.cpp @@ -661,20 +661,3 @@ gfxFT2Font::FillGlyphDataForChar(PRUint32 ch, CachedGlyphData *gd) gd->rsbDelta = face->glyph->rsb_delta; gd->xAdvance = face->glyph->advance.x; } - -void -gfxFT2Font::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const -{ - gfxFont::SizeOfExcludingThis(aMallocSizeOf, aSizes); - aSizes->mFontInstances += - mCharGlyphCache.SizeOfExcludingThis(nsnull, aMallocSizeOf); -} - -void -gfxFT2Font::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const -{ - aSizes->mFontInstances += aMallocSizeOf(this); - SizeOfExcludingThis(aMallocSizeOf, aSizes); -} diff --git a/gfx/thebes/gfxFT2Fonts.h b/gfx/thebes/gfxFT2Fonts.h index 7abf39f4416..61c8b51093e 100644 --- a/gfx/thebes/gfxFT2Fonts.h +++ b/gfx/thebes/gfxFT2Fonts.h @@ -96,11 +96,6 @@ public: // new functions return &entry->mData; } - virtual void SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const; - virtual void SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const; - protected: virtual bool ShapeWord(gfxContext *aContext, gfxShapedWord *aShapedWord, diff --git a/gfx/thebes/gfxFont.cpp b/gfx/thebes/gfxFont.cpp index a72edd8cb41..733d7e72150 100644 --- a/gfx/thebes/gfxFont.cpp +++ b/gfx/thebes/gfxFont.cpp @@ -47,6 +47,7 @@ #include "nsReadableUtils.h" #include "nsExpirationTracker.h" #include "nsILanguageAtomService.h" +#include "nsIMemoryReporter.h" #include "nsITimer.h" #include "gfxFont.h" @@ -401,44 +402,6 @@ gfxFontEntry::CheckForGraphiteTables() } #endif -/* static */ size_t -gfxFontEntry::FontTableHashEntry::SizeOfEntryExcludingThis - (FontTableHashEntry *aEntry, - nsMallocSizeOfFun aMallocSizeOf, - void* aUserArg) -{ - if (aEntry->mBlob) { - FontListSizes *sizes = static_cast(aUserArg); - sizes->mFontTableCacheSize += aMallocSizeOf(aEntry->mBlob); - sizes->mFontTableCacheSize += - aMallocSizeOf(hb_blob_get_data(aEntry->mBlob, NULL)); - } - - // the size of the blob is recorded in the FontListSizes record, - // so we return 0 here for the function result - return 0; -} - -void -gfxFontEntry::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - aSizes->mFontListSize += mName.SizeOfExcludingThisIfUnshared(aMallocSizeOf); - aSizes->mCharMapsSize += mCharacterMap.SizeOfExcludingThis(aMallocSizeOf); - aSizes->mFontTableCacheSize += - mFontTableCache.SizeOfExcludingThis( - FontTableHashEntry::SizeOfEntryExcludingThis, - aMallocSizeOf, aSizes); -} - -void -gfxFontEntry::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - aSizes->mFontListSize += aMallocSizeOf(this); - SizeOfExcludingThis(aMallocSizeOf, aSizes); -} - ////////////////////////////////////////////////////////////////////////////// // // class gfxFontFamily @@ -1013,32 +976,6 @@ gfxFontFamily::FindFont(const nsAString& aPostscriptName) return nsnull; } -void -gfxFontFamily::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - aSizes->mFontListSize += - mName.SizeOfExcludingThisIfUnshared(aMallocSizeOf); - aSizes->mCharMapsSize += mCharacterMap.SizeOfExcludingThis(aMallocSizeOf); - - aSizes->mFontListSize += - mAvailableFonts.SizeOfExcludingThis(aMallocSizeOf); - for (PRUint32 i = 0; i < mAvailableFonts.Length(); ++i) { - gfxFontEntry *fe = mAvailableFonts[i]; - if (fe) { - fe->SizeOfIncludingThis(aMallocSizeOf, aSizes); - } - } -} - -void -gfxFontFamily::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - aSizes->mFontListSize += aMallocSizeOf(this); - SizeOfExcludingThis(aMallocSizeOf, aSizes); -} - /* * gfxFontCache - global cache of gfxFont instances. * Expires unused fonts after a short interval; @@ -1047,52 +984,6 @@ gfxFontFamily::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, * shaped-word caches to free up memory. */ -NS_IMPL_ISUPPORTS1(gfxFontCache::MemoryReporter, nsIMemoryMultiReporter) - -NS_MEMORY_REPORTER_MALLOC_SIZEOF_FUN(FontCacheMallocSizeOf, "font-cache") - -NS_IMETHODIMP -gfxFontCache::MemoryReporter::GetName(nsACString &aName) -{ - aName.AssignLiteral("font-cache"); - return NS_OK; -} - -NS_IMETHODIMP -gfxFontCache::MemoryReporter::CollectReports - (nsIMemoryMultiReporterCallback* aCb, - nsISupports* aClosure) -{ - FontCacheSizes sizes; - - gfxFontCache::GetCache()->SizeOfIncludingThis(&FontCacheMallocSizeOf, - &sizes); - - aCb->Callback(EmptyCString(), - NS_LITERAL_CSTRING("explicit/gfx/font-cache"), - nsIMemoryReporter::KIND_HEAP, nsIMemoryReporter::UNITS_BYTES, - sizes.mFontInstances, - NS_LITERAL_CSTRING("Memory used for active font instances."), - aClosure); - - aCb->Callback(EmptyCString(), - NS_LITERAL_CSTRING("explicit/gfx/font-shaped-words"), - nsIMemoryReporter::KIND_HEAP, nsIMemoryReporter::UNITS_BYTES, - sizes.mShapedWords, - NS_LITERAL_CSTRING("Memory used to cache shaped glyph data."), - aClosure); - - return NS_OK; -} - -NS_IMETHODIMP -gfxFontCache::MemoryReporter::GetExplicitNonHeap(PRInt64* aAmount) -{ - // This reporter only measures heap memory. - *aAmount = 0; - return NS_OK; -} - // Observer for the memory-pressure notification, to trigger // flushing of the shaped-word caches class MemoryPressureObserver : public nsIObserver, @@ -1124,11 +1015,7 @@ gfxFontCache::Init() { NS_ASSERTION(!gGlobalCache, "Where did this come from?"); gGlobalCache = new gfxFontCache(); - if (!gGlobalCache) { - return NS_ERROR_OUT_OF_MEMORY; - } - NS_RegisterMemoryMultiReporter(new MemoryReporter); - return NS_OK; + return gGlobalCache ? NS_OK : NS_ERROR_OUT_OF_MEMORY; } void @@ -1289,39 +1176,6 @@ gfxFontCache::ClearCachedWordsForFont(HashEntry* aHashEntry, void* aUserData) return PL_DHASH_NEXT; } -/*static*/ -size_t -gfxFontCache::SizeOfFontEntryExcludingThis(HashEntry* aHashEntry, - nsMallocSizeOfFun aMallocSizeOf, - void* aUserArg) -{ - HashEntry *entry = static_cast(aHashEntry); - FontCacheSizes *sizes = static_cast(aUserArg); - entry->mFont->SizeOfExcludingThis(aMallocSizeOf, sizes); - - // The font records its size in the |sizes| parameter, so we return zero - // here to the hashtable enumerator. - return 0; -} - -void -gfxFontCache::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const -{ - // TODO: add the overhead of the expiration tracker (generation arrays) - - mFonts.SizeOfExcludingThis(SizeOfFontEntryExcludingThis, - aMallocSizeOf, aSizes); -} - -void -gfxFontCache::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const -{ - aSizes->mFontInstances += aMallocSizeOf(this); - SizeOfExcludingThis(aMallocSizeOf, aSizes); -} - void gfxFont::RunMetrics::CombineWith(const RunMetrics& aOther, bool aOtherIsOnLeft) { @@ -2081,10 +1935,6 @@ gfxFont::GetShapedWord(gfxContext *aContext, aFlags); CacheHashEntry *entry = mWordCache.PutEntry(key); - if (!entry) { - NS_WARNING("failed to create word cache entry - expect missing text"); - return nsnull; - } gfxShapedWord *sw = entry->mShapedWord; Telemetry::Accumulate(Telemetry::WORD_CACHE_LOOKUP_LEN, aLength); Telemetry::Accumulate(Telemetry::WORD_CACHE_LOOKUP_SCRIPT, aRunScript); @@ -2100,21 +1950,20 @@ gfxFont::GetShapedWord(gfxContext *aContext, aRunScript, aAppUnitsPerDevUnit, aFlags); + NS_ASSERTION(sw != nsnull, + "failed to create gfxShapedWord - expect missing text"); if (!sw) { - NS_WARNING("failed to create gfxShapedWord - expect missing text"); return nsnull; } - bool ok = false; + bool ok; if (sizeof(T) == sizeof(PRUnichar)) { ok = ShapeWord(aContext, sw, (const PRUnichar*)aText); } else { nsAutoString utf16; AppendASCIItoUTF16(nsDependentCSubstring((const char*)aText, aLength), utf16); - if (utf16.Length() == aLength) { - ok = ShapeWord(aContext, sw, utf16.BeginReading()); - } + ok = ShapeWord(aContext, sw, utf16.BeginReading()); } NS_WARN_IF_FALSE(ok, "failed to shape word - expect garbled text"); @@ -2671,40 +2520,10 @@ gfxFont::SynthesizeSpaceWidth(PRUint32 aCh) } } -/*static*/ size_t -gfxFont::WordCacheEntrySizeOfExcludingThis(CacheHashEntry* aHashEntry, - nsMallocSizeOfFun aMallocSizeOf, - void* aUserArg) -{ - return aMallocSizeOf(aHashEntry->mShapedWord.get()); -} - -void -gfxFont::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const -{ - for (PRUint32 i = 0; i < mGlyphExtentsArray.Length(); ++i) { - aSizes->mFontInstances += - mGlyphExtentsArray[i]->SizeOfIncludingThis(aMallocSizeOf); - } - aSizes->mShapedWords += - mWordCache.SizeOfExcludingThis(WordCacheEntrySizeOfExcludingThis, - aMallocSizeOf); -} - -void -gfxFont::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const -{ - aSizes->mFontInstances += aMallocSizeOf(this); - SizeOfExcludingThis(aMallocSizeOf, aSizes); -} - gfxGlyphExtents::~gfxGlyphExtents() { #ifdef DEBUG_TEXT_RUN_STORAGE_METRICS - gGlyphExtentsWidthsTotalSize += - mContainedGlyphWidths.SizeOfExcludingThis(&FontCacheMallocSizeOf); + gGlyphExtentsWidthsTotalSize += mContainedGlyphWidths.ComputeSize(); gGlyphExtentsCount++; #endif MOZ_COUNT_DTOR(gfxGlyphExtents); @@ -2748,19 +2567,21 @@ gfxGlyphExtents::GlyphWidths::~GlyphWidths() } } +#ifdef DEBUG PRUint32 -gfxGlyphExtents::GlyphWidths::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const +gfxGlyphExtents::GlyphWidths::ComputeSize() { PRUint32 i; - PRUint32 size = mBlocks.SizeOfExcludingThis(aMallocSizeOf); + PRUint32 size = mBlocks.Capacity()*sizeof(PtrBits); for (i = 0; i < mBlocks.Length(); ++i) { PtrBits bits = mBlocks[i]; if (bits && !(bits & 0x1)) { - size += aMallocSizeOf(reinterpret_cast(bits)); + size += BLOCK_SIZE*sizeof(PRUint16); } } return size; } +#endif void gfxGlyphExtents::GlyphWidths::Set(PRUint32 aGlyphID, PRUint16 aWidth) @@ -2812,19 +2633,6 @@ gfxGlyphExtents::SetTightGlyphExtents(PRUint32 aGlyphID, const gfxRect& aExtents entry->height = aExtentsAppUnits.Height(); } -size_t -gfxGlyphExtents::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const -{ - return mContainedGlyphWidths.SizeOfExcludingThis(aMallocSizeOf) + - mTightGlyphExtents.SizeOfExcludingThis(nsnull, aMallocSizeOf); -} - -size_t -gfxGlyphExtents::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf) const -{ - return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf); -} - gfxFontGroup::gfxFontGroup(const nsAString& aFamilies, const gfxFontStyle *aStyle, gfxUserFontSet *aUserFontSet) : mFamilies(aFamilies), mStyle(*aStyle), mUnderlineOffset(UNDERLINE_OFFSET_NOT_SET) { diff --git a/gfx/thebes/gfxFont.h b/gfx/thebes/gfxFont.h index dd44ddd91d9..1a246a51c23 100644 --- a/gfx/thebes/gfxFont.h +++ b/gfx/thebes/gfxFont.h @@ -59,7 +59,6 @@ #include "nsISupportsImpl.h" #include "gfxPattern.h" #include "mozilla/HashFunctions.h" -#include "nsIMemoryReporter.h" typedef struct _cairo_scaled_font cairo_scaled_font_t; @@ -91,8 +90,6 @@ struct THEBES_API gfxFontFeature { // to features that select among multiple alternatives }; -struct FontListSizes; - inline bool operator<(const gfxFontFeature& a, const gfxFontFeature& b) { @@ -316,12 +313,6 @@ public: hb_blob_t *ShareFontTableAndGetBlob(PRUint32 aTag, FallibleTArray* aTable); - // For memory reporting - virtual void SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - virtual void SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - nsString mName; bool mItalic : 1; @@ -476,11 +467,6 @@ private: void Clear(); - static size_t - SizeOfEntryExcludingThis(FontTableHashEntry *aEntry, - nsMallocSizeOfFun aMallocSizeOf, - void* aUserArg); - private: static void DeleteFontTableBlobData(void *aBlobData); // not implemented @@ -647,12 +633,6 @@ public: // if so set the mIsSimpleFamily flag (defaults to False before we've checked) void CheckForSimpleFamily(); - // For memory reporter - virtual void SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - virtual void SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - protected: // fills in an array with weights of faces that match style, // returns whether any matching entries found @@ -743,15 +723,6 @@ struct gfxTextRange { * completely, with all its words, and avoid the cost of aging the words * individually. That only happens with longer-lived fonts. */ -struct FontCacheSizes { - FontCacheSizes() - : mFontInstances(0), mShapedWords(0) - { } - - size_t mFontInstances; // memory used by instances of gfxFont subclasses - size_t mShapedWords; // memory used by the per-font shapedWord caches -}; - class THEBES_API gfxFontCache MOZ_FINAL : public nsExpirationTracker { public: enum { @@ -805,20 +776,7 @@ public: mFonts.EnumerateEntries(ClearCachedWordsForFont, nsnull); } - void SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const; - void SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const; - protected: - class MemoryReporter - : public nsIMemoryMultiReporter - { - public: - NS_DECL_ISUPPORTS - NS_DECL_NSIMEMORYMULTIREPORTER - }; - void DestroyFont(gfxFont *aFont); static gfxFontCache *gGlobalCache; @@ -851,10 +809,6 @@ protected: gfxFont* mFont; }; - static size_t SizeOfFontEntryExcludingThis(HashEntry* aHashEntry, - nsMallocSizeOfFun aMallocSizeOf, - void* aUserArg); - nsTHashtable mFonts; static PLDHashOperator ClearCachedWordsForFont(HashEntry* aHashEntry, void*); @@ -1026,9 +980,6 @@ public: PRUint32 GetAppUnitsPerDevUnit() { return mAppUnitsPerDevUnit; } - size_t SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const; - size_t SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf) const; - private: class HashEntry : public nsUint32HashKey { public: @@ -1065,7 +1016,9 @@ private: return widths[indexInBlock]; } - PRUint32 SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const; +#ifdef DEBUG + PRUint32 ComputeSize(); +#endif ~GlyphWidths(); @@ -1084,7 +1037,7 @@ private: nsTArray mBlocks; }; - + GlyphWidths mContainedGlyphWidths; nsTHashtable mTightGlyphExtents; PRUint32 mAppUnitsPerDevUnit; @@ -1521,11 +1474,6 @@ public: } } - virtual void SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const; - virtual void SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const; - protected: // Call the appropriate shaper to generate glyphs for aText and store // them into aShapedWord. @@ -1610,11 +1558,6 @@ protected: nsAutoPtr mShapedWord; }; - static size_t - WordCacheEntrySizeOfExcludingThis(CacheHashEntry* aHashEntry, - nsMallocSizeOfFun aMallocSizeOf, - void* aUserArg); - nsTHashtable mWordCache; static PLDHashOperator AgeCacheEntry(CacheHashEntry *aEntry, void *aUserData); diff --git a/gfx/thebes/gfxFontUtils.h b/gfx/thebes/gfxFontUtils.h index 3d6ba81f7d9..e7f853f4893 100644 --- a/gfx/thebes/gfxFontUtils.h +++ b/gfx/thebes/gfxFontUtils.h @@ -264,18 +264,14 @@ public: } } - size_t SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const { - size_t total = mBlocks.SizeOfExcludingThis(aMallocSizeOf); + PRUint32 GetSize() { + PRUint32 size = 0; for (PRUint32 i = 0; i < mBlocks.Length(); i++) { - if (mBlocks[i]) { - total += aMallocSizeOf(mBlocks[i]); - } + if (mBlocks[i]) + size += sizeof(Block); + size += sizeof(nsAutoPtr); } - return total; - } - - size_t SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf) const { - return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf); + return size; } // clear out all blocks in the array diff --git a/gfx/thebes/gfxGDIFont.cpp b/gfx/thebes/gfxGDIFont.cpp index 73c690209ae..b9b15b9b048 100644 --- a/gfx/thebes/gfxGDIFont.cpp +++ b/gfx/thebes/gfxGDIFont.cpp @@ -560,20 +560,3 @@ gfxGDIFont::GetGlyphWidth(gfxContext *aCtx, PRUint16 aGID) return -1; } - -void -gfxGDIFont::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const -{ - gfxFont::SizeOfExcludingThis(aMallocSizeOf, aSizes); - aSizes->mFontInstances += aMallocSizeOf(mMetrics) + - mGlyphWidths.SizeOfExcludingThis(nsnull, aMallocSizeOf); -} - -void -gfxGDIFont::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const -{ - aSizes->mFontInstances += aMallocSizeOf(this); - SizeOfExcludingThis(aMallocSizeOf, aSizes); -} diff --git a/gfx/thebes/gfxGDIFont.h b/gfx/thebes/gfxGDIFont.h index bdaf34b452a..99dba135592 100644 --- a/gfx/thebes/gfxGDIFont.h +++ b/gfx/thebes/gfxGDIFont.h @@ -88,11 +88,6 @@ public: // get hinted glyph width in pixels as 16.16 fixed-point value virtual PRInt32 GetGlyphWidth(gfxContext *aCtx, PRUint16 aGID); - virtual void SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const; - virtual void SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const; - protected: virtual void CreatePlatformShaper(); diff --git a/gfx/thebes/gfxGDIFontList.cpp b/gfx/thebes/gfxGDIFontList.cpp index c40304bf73f..3230fa287fc 100644 --- a/gfx/thebes/gfxGDIFontList.cpp +++ b/gfx/thebes/gfxGDIFontList.cpp @@ -246,8 +246,7 @@ GDIFontEntry::ReadCMAP() #ifdef PR_LOGGING LOG_FONTLIST(("(fontlist-cmap) name: %s, size: %d\n", - NS_ConvertUTF16toUTF8(mName).get(), - mCharacterMap.SizeOfExcludingThis(moz_malloc_size_of))); + NS_ConvertUTF16toUTF8(mName).get(), mCharacterMap.GetSize())); if (LOG_CMAPDATA_ENABLED()) { char prefix[256]; sprintf(prefix, "(cmapdata) name: %.220s", @@ -460,14 +459,6 @@ GDIFontEntry::CreateFontEntry(const nsAString& aName, return fe; } -void -GDIFontEntry::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - aSizes->mFontListSize += aMallocSizeOf(this); - SizeOfExcludingThis(aMallocSizeOf, aSizes); -} - /*************************************************************** * * GDIFontFamily @@ -667,7 +658,7 @@ gfxGDIFontList::GetFontSubstitutes() nsAutoString substituteName; substituteName.AssignLiteral("Courier"); BuildKeyNameFromFontName(substituteName); - if (!mFontSubstitutes.GetWeak(substituteName)) { + if (!mFontSubstitutes.Get(substituteName)) { gfxFontFamily *ff; nsAutoString actualFontName; actualFontName.AssignLiteral("Courier New"); @@ -752,6 +743,7 @@ gfxFontEntry* gfxGDIFontList::LookupLocalFont(const gfxProxyFontEntry *aProxyEntry, const nsAString& aFullname) { + bool found; gfxFontEntry *lookup; // initialize name lookup tables if needed @@ -760,8 +752,8 @@ gfxGDIFontList::LookupLocalFont(const gfxProxyFontEntry *aProxyEntry, } // lookup in name lookup tables, return null if not found - if (!(lookup = mPostscriptNames.GetWeak(aFullname)) && - !(lookup = mFullnames.GetWeak(aFullname))) + if (!(lookup = mPostscriptNames.GetWeak(aFullname, &found)) && + !(lookup = mFullnames.GetWeak(aFullname, &found))) { return nsnull; } @@ -1046,8 +1038,8 @@ gfxGDIFontList::ResolveFontName(const nsAString& aFontName, nsAString& aResolved nsAutoString keyName(aFontName); BuildKeyNameFromFontName(keyName); - gfxFontFamily *ff = mFontSubstitutes.GetWeak(keyName); - if (ff) { + nsRefPtr ff; + if (mFontSubstitutes.Get(keyName, &ff)) { aResolvedFontName = ff->Name(); return true; } @@ -1060,27 +1052,3 @@ gfxGDIFontList::ResolveFontName(const nsAString& aFontName, nsAString& aResolved return false; } - -void -gfxGDIFontList::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - gfxPlatformFontList::SizeOfExcludingThis(aMallocSizeOf, aSizes); - aSizes->mFontListSize += - mFontSubstitutes.SizeOfExcludingThis(SizeOfFamilyNameEntryExcludingThis, - aMallocSizeOf); - aSizes->mFontListSize += - mNonExistingFonts.SizeOfExcludingThis(aMallocSizeOf); - for (PRUint32 i = 0; i < mNonExistingFonts.Length(); ++i) { - aSizes->mFontListSize += - mNonExistingFonts[i].SizeOfExcludingThisIfUnshared(aMallocSizeOf); - } -} - -void -gfxGDIFontList::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - aSizes->mFontListSize += aMallocSizeOf(this); - SizeOfExcludingThis(aMallocSizeOf, aSizes); -} diff --git a/gfx/thebes/gfxGDIFontList.h b/gfx/thebes/gfxGDIFontList.h index 96834e023b5..320879b3d73 100644 --- a/gfx/thebes/gfxGDIFontList.h +++ b/gfx/thebes/gfxGDIFontList.h @@ -274,9 +274,6 @@ public: virtual bool TestCharacterMap(PRUint32 aCh); - virtual void SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - // create a font entry for a font with a given name static GDIFontEntry* CreateFontEntry(const nsAString& aName, gfxWindowsFontType aFontType, @@ -350,11 +347,6 @@ public: virtual bool ResolveFontName(const nsAString& aFontName, nsAString& aResolvedFontName); - virtual void SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - virtual void SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - private: friend class gfxWindowsPlatform; @@ -369,7 +361,7 @@ private: DWORD fontType, LPARAM lParam); - typedef nsRefPtrHashtable FontTable; + typedef nsDataHashtable > FontTable; FontTable mFontSubstitutes; nsTArray mNonExistingFonts; diff --git a/gfx/thebes/gfxMacFont.cpp b/gfx/thebes/gfxMacFont.cpp index b7744825a7b..4407c04f900 100644 --- a/gfx/thebes/gfxMacFont.cpp +++ b/gfx/thebes/gfxMacFont.cpp @@ -509,19 +509,3 @@ gfxMacFont::GetScaledFont() return mAzureFont; } -void -gfxMacFont::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const -{ - gfxFont::SizeOfExcludingThis(aMallocSizeOf, aSizes); - // mCGFont is shared with the font entry, so not counted here; - // and we don't have APIs to measure the cairo mFontFace object -} - -void -gfxMacFont::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const -{ - aSizes->mFontInstances += aMallocSizeOf(this); - SizeOfExcludingThis(aMallocSizeOf, aSizes); -} diff --git a/gfx/thebes/gfxMacFont.h b/gfx/thebes/gfxMacFont.h index 2f0ce551e17..6806cc582c9 100644 --- a/gfx/thebes/gfxMacFont.h +++ b/gfx/thebes/gfxMacFont.h @@ -81,11 +81,6 @@ public: mozilla::RefPtr GetScaledFont(); - virtual void SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const; - virtual void SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontCacheSizes* aSizes) const; - protected: virtual void CreatePlatformShaper(); diff --git a/gfx/thebes/gfxMacPlatformFontList.h b/gfx/thebes/gfxMacPlatformFontList.h index 91ec2c73080..30d527b240e 100644 --- a/gfx/thebes/gfxMacPlatformFontList.h +++ b/gfx/thebes/gfxMacPlatformFontList.h @@ -111,9 +111,6 @@ public: virtual nsresult GetFontTable(PRUint32 aTableTag, FallibleTArray& aBuffer); - virtual void SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - protected: virtual bool HasFontTable(PRUint32 aTableTag); @@ -137,9 +134,6 @@ public: virtual nsresult GetFontTable(PRUint32 aTableTag, FallibleTArray& aBuffer); - virtual void SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - protected: virtual bool HasFontTable(PRUint32 aTableTag); }; diff --git a/gfx/thebes/gfxMacPlatformFontList.mm b/gfx/thebes/gfxMacPlatformFontList.mm index 01a75ec7c0c..65e78092118 100644 --- a/gfx/thebes/gfxMacPlatformFontList.mm +++ b/gfx/thebes/gfxMacPlatformFontList.mm @@ -270,7 +270,7 @@ MacOSFontEntry::ReadCMAP() #ifdef PR_LOGGING LOG_FONTLIST(("(fontlist-cmap) name: %s, size: %d\n", NS_ConvertUTF16toUTF8(mName).get(), - mCharacterMap.SizeOfExcludingThis(moz_malloc_size_of))); + mCharacterMap.GetSize())); if (LOG_CMAPDATA_ENABLED()) { char prefix[256]; sprintf(prefix, "(cmapdata) name: %.220s", @@ -398,14 +398,6 @@ ATSFontEntry::HasFontTable(PRUint32 aTableTag) (::ATSFontGetTable(fontRef, aTableTag, 0, 0, 0, &size) == noErr); } -void -ATSFontEntry::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - aSizes->mFontListSize += aMallocSizeOf(this); - SizeOfExcludingThis(aMallocSizeOf, aSizes); -} - /* CGFontEntry - used on Mac OS X 10.6+ */ #pragma mark- @@ -494,14 +486,6 @@ CGFontEntry::HasFontTable(PRUint32 aTableTag) return true; } -void -CGFontEntry::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - aSizes->mFontListSize += aMallocSizeOf(this); - SizeOfExcludingThis(aMallocSizeOf, aSizes); -} - /* gfxMacFontFamily */ #pragma mark- @@ -827,9 +811,10 @@ gfxMacPlatformFontList::InitSingleFaceList() #endif // add only if doesn't exist already - if (!mFontFamilies.GetWeak(key)) { - gfxFontFamily *familyEntry = - new gfxSingleFaceMacFontFamily(familyName); + bool found; + gfxFontFamily *familyEntry; + if (!(familyEntry = mFontFamilies.GetWeak(key, &found))) { + familyEntry = new gfxSingleFaceMacFontFamily(familyName); familyEntry->AddFontEntry(fontEntry); familyEntry->SetHasStyles(true); mFontFamilies.Put(key, familyEntry); diff --git a/gfx/thebes/gfxPlatformFontList.cpp b/gfx/thebes/gfxPlatformFontList.cpp index 5c467b76768..b65675f8ad9 100644 --- a/gfx/thebes/gfxPlatformFontList.cpp +++ b/gfx/thebes/gfxPlatformFontList.cpp @@ -130,60 +130,6 @@ gfxFontListPrefObserver::Observe(nsISupports *aSubject, return NS_OK; } -NS_IMPL_ISUPPORTS1(gfxPlatformFontList::MemoryReporter, nsIMemoryMultiReporter) - -NS_MEMORY_REPORTER_MALLOC_SIZEOF_FUN(FontListMallocSizeOf, "font-list") - -NS_IMETHODIMP -gfxPlatformFontList::MemoryReporter::GetName(nsACString &aName) -{ - aName.AssignLiteral("font-list"); - return NS_OK; -} - -NS_IMETHODIMP -gfxPlatformFontList::MemoryReporter::CollectReports - (nsIMemoryMultiReporterCallback* aCb, - nsISupports* aClosure) -{ - FontListSizes sizes; - - gfxPlatformFontList::PlatformFontList()->SizeOfIncludingThis(&FontListMallocSizeOf, - &sizes); - - aCb->Callback(EmptyCString(), - NS_LITERAL_CSTRING("explicit/gfx/font-list"), - nsIMemoryReporter::KIND_HEAP, nsIMemoryReporter::UNITS_BYTES, - sizes.mFontListSize, - NS_LITERAL_CSTRING("Memory used to manage the list of font families and faces."), - aClosure); - - aCb->Callback(EmptyCString(), - NS_LITERAL_CSTRING("explicit/gfx/font-charmaps"), - nsIMemoryReporter::KIND_HEAP, nsIMemoryReporter::UNITS_BYTES, - sizes.mCharMapsSize, - NS_LITERAL_CSTRING("Memory used to record the character coverage of individual fonts."), - aClosure); - - if (sizes.mFontTableCacheSize) { - aCb->Callback(EmptyCString(), - NS_LITERAL_CSTRING("explicit/gfx/font-tables"), - nsIMemoryReporter::KIND_HEAP, nsIMemoryReporter::UNITS_BYTES, - sizes.mFontTableCacheSize, - NS_LITERAL_CSTRING("Memory used for cached font metrics and layout tables."), - aClosure); - } - - return NS_OK; -} - -NS_IMETHODIMP -gfxPlatformFontList::MemoryReporter::GetExplicitNonHeap(PRInt64* aAmount) -{ - // This reporter only measures heap memory. - *aAmount = 0; - return NS_OK; -} gfxPlatformFontList::gfxPlatformFontList(bool aNeedFullnamePostscriptNames) : mNeedFullnamePostscriptNames(aNeedFullnamePostscriptNames), @@ -238,8 +184,6 @@ gfxPlatformFontList::InitFontList() mCodepointsWithNoFonts.SetRange(0,0x1f); // C0 controls mCodepointsWithNoFonts.SetRange(0x7f,0x9f); // C1 controls - NS_RegisterMemoryMultiReporter(new MemoryReporter); - sPlatformFontList = this; return NS_OK; @@ -300,11 +244,12 @@ gfxPlatformFontList::PreloadNamesList() PRUint32 numFonts = preloadFonts.Length(); for (PRUint32 i = 0; i < numFonts; i++) { + bool found; nsAutoString key; GenerateFontListKey(preloadFonts[i], key); // only search canonical names! - gfxFontFamily *familyEntry = mFontFamilies.GetWeak(key); + gfxFontFamily *familyEntry = mFontFamilies.GetWeak(key, &found); if (familyEntry) { familyEntry->ReadOtherFamilyNames(this); } @@ -604,17 +549,18 @@ gfxPlatformFontList::FindFamily(const nsAString& aFamily) { nsAutoString key; gfxFontFamily *familyEntry; + bool found; GenerateFontListKey(aFamily, key); NS_ASSERTION(mFontFamilies.Count() != 0, "system font list was not initialized correctly"); // lookup in canonical (i.e. English) family name list - if ((familyEntry = mFontFamilies.GetWeak(key))) { + if ((familyEntry = mFontFamilies.GetWeak(key, &found))) { return familyEntry; } // lookup in other family names list (mostly localized names) - if ((familyEntry = mOtherFamilyNames.GetWeak(key)) != nsnull) { + if ((familyEntry = mOtherFamilyNames.GetWeak(key, &found)) != nsnull) { return familyEntry; } @@ -625,7 +571,7 @@ gfxPlatformFontList::FindFamily(const nsAString& aFamily) // in practice so avoid pulling in names at startup if (!mOtherFamilyNamesInitialized && !IsASCII(aFamily)) { InitOtherFamilyNames(); - if ((familyEntry = mOtherFamilyNames.GetWeak(key)) != nsnull) { + if ((familyEntry = mOtherFamilyNames.GetWeak(key, &found)) != nsnull) { return familyEntry; } } @@ -662,9 +608,10 @@ void gfxPlatformFontList::AddOtherFamilyName(gfxFontFamily *aFamilyEntry, nsAString& aOtherFamilyName) { nsAutoString key; + bool found; GenerateFontListKey(aOtherFamilyName, key); - if (!mOtherFamilyNames.GetWeak(key)) { + if (!mOtherFamilyNames.GetWeak(key, &found)) { mOtherFamilyNames.Put(key, aFamilyEntry); #ifdef PR_LOGGING LOG_FONTLIST(("(fontlist-otherfamily) canonical family: %s, " @@ -680,7 +627,9 @@ gfxPlatformFontList::AddOtherFamilyName(gfxFontFamily *aFamilyEntry, nsAString& void gfxPlatformFontList::AddFullname(gfxFontEntry *aFontEntry, nsAString& aFullname) { - if (!mFullnames.GetWeak(aFullname)) { + bool found; + + if (!mFullnames.GetWeak(aFullname, &found)) { mFullnames.Put(aFullname, aFontEntry); #ifdef PR_LOGGING LOG_FONTLIST(("(fontlist-fullname) name: %s, fullname: %s\n", @@ -693,7 +642,9 @@ gfxPlatformFontList::AddFullname(gfxFontEntry *aFontEntry, nsAString& aFullname) void gfxPlatformFontList::AddPostscriptName(gfxFontEntry *aFontEntry, nsAString& aPostscriptName) { - if (!mPostscriptNames.GetWeak(aPostscriptName)) { + bool found; + + if (!mPostscriptNames.GetWeak(aPostscriptName, &found)) { mPostscriptNames.Put(aPostscriptName, aFontEntry); #ifdef PR_LOGGING LOG_FONTLIST(("(fontlist-postscript) name: %s, psname: %s\n", @@ -763,111 +714,3 @@ gfxPlatformFontList::FinishLoader() mFontFamiliesToLoad.Clear(); mNumFamilies = 0; } - -// Support for memory reporting - -static size_t -SizeOfFamilyEntryExcludingThis(const nsAString& aKey, - const nsRefPtr& aFamily, - nsMallocSizeOfFun aMallocSizeOf, - void* aUserArg) -{ - FontListSizes *sizes = static_cast(aUserArg); - aFamily->SizeOfExcludingThis(aMallocSizeOf, sizes); - - sizes->mFontListSize += aKey.SizeOfExcludingThisIfUnshared(aMallocSizeOf); - - // we return zero here because the measurements have been added directly - // to the relevant fields of the FontListSizes record - return 0; -} - -// this is also used by subclasses that hold additional hashes of family names -/*static*/ size_t -gfxPlatformFontList::SizeOfFamilyNameEntryExcludingThis - (const nsAString& aKey, - const nsRefPtr& aFamily, - nsMallocSizeOfFun aMallocSizeOf, - void* aUserArg) -{ - // we don't count the size of the family here, because this is an *extra* - // reference to a family that will have already been counted in the main list - return aKey.SizeOfExcludingThisIfUnshared(aMallocSizeOf); -} - -static size_t -SizeOfFontNameEntryExcludingThis(const nsAString& aKey, - const nsRefPtr& aFont, - nsMallocSizeOfFun aMallocSizeOf, - void* aUserArg) -{ - // the font itself is counted by its owning family; here we only care about - // the name stored in the hashtable key - return aKey.SizeOfExcludingThisIfUnshared(aMallocSizeOf); -} - -static size_t -SizeOfPrefFontEntryExcludingThis - (const PRUint32& aKey, - const nsTArray >& aList, - nsMallocSizeOfFun aMallocSizeOf, - void* aUserArg) -{ - // again, we only care about the size of the array itself; we don't follow - // the refPtrs stored in it, because they point to entries already owned - // and accounted-for by the main font list - return aList.SizeOfExcludingThis(aMallocSizeOf); -} - -static size_t -SizeOfStringEntryExcludingThis(nsStringHashKey* aHashEntry, - nsMallocSizeOfFun aMallocSizeOf, - void* aUserArg) -{ - return aHashEntry->GetKey().SizeOfExcludingThisIfUnshared(aMallocSizeOf); -} - -void -gfxPlatformFontList::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - aSizes->mFontListSize += - mFontFamilies.SizeOfExcludingThis(SizeOfFamilyEntryExcludingThis, - aMallocSizeOf, aSizes); - - aSizes->mFontListSize += - mOtherFamilyNames.SizeOfExcludingThis(SizeOfFamilyNameEntryExcludingThis, - aMallocSizeOf); - - if (mNeedFullnamePostscriptNames) { - aSizes->mFontListSize += - mFullnames.SizeOfExcludingThis(SizeOfFontNameEntryExcludingThis, - aMallocSizeOf); - aSizes->mFontListSize += - mPostscriptNames.SizeOfExcludingThis(SizeOfFontNameEntryExcludingThis, - aMallocSizeOf); - } - - aSizes->mFontListSize += - mCodepointsWithNoFonts.SizeOfExcludingThis(aMallocSizeOf); - aSizes->mFontListSize += - mReplacementCharFallbackFamily.SizeOfExcludingThisIfUnshared(aMallocSizeOf); - aSizes->mFontListSize += - mFontFamiliesToLoad.SizeOfExcludingThis(aMallocSizeOf); - - aSizes->mFontListSize += - mPrefFonts.SizeOfExcludingThis(SizeOfPrefFontEntryExcludingThis, - aMallocSizeOf); - - aSizes->mFontListSize += - mBadUnderlineFamilyNames.SizeOfExcludingThis(SizeOfStringEntryExcludingThis, - aMallocSizeOf); -} - -void -gfxPlatformFontList::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const -{ - aSizes->mFontListSize += aMallocSizeOf(this); - SizeOfExcludingThis(aMallocSizeOf, aSizes); -} diff --git a/gfx/thebes/gfxPlatformFontList.h b/gfx/thebes/gfxPlatformFontList.h index e1cdc36c902..59509552660 100644 --- a/gfx/thebes/gfxPlatformFontList.h +++ b/gfx/thebes/gfxPlatformFontList.h @@ -47,7 +47,6 @@ #include "gfxFont.h" #include "gfxPlatform.h" -#include "nsIMemoryReporter.h" #include "mozilla/FunctionTimer.h" // gfxPlatformFontList is an abstract class for the global font list on the system; @@ -58,18 +57,6 @@ // Much of this is based on the old gfxQuartzFontCache, but adapted for use on all platforms. -struct FontListSizes { - FontListSizes() - : mFontListSize(0), mFontTableCacheSize(0), mCharMapsSize(0) - { } - - size_t mFontListSize; // size of the font list and dependent objects - // (font family and face names, etc), but NOT - // including the font table cache and the cmaps - size_t mFontTableCacheSize; // memory used for the gfxFontEntry table caches - size_t mCharMapsSize; // memory used for cmap coverage info -}; - class gfxPlatformFontList : protected gfxFontInfoLoader { public: @@ -154,20 +141,7 @@ public: // (platforms may override, eg Mac) virtual bool GetStandardFamilyName(const nsAString& aFontName, nsAString& aFamilyName); - virtual void SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - virtual void SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf, - FontListSizes* aSizes) const; - protected: - class MemoryReporter - : public nsIMemoryMultiReporter - { - public: - NS_DECL_ISUPPORTS - NS_DECL_NSIMEMORYMULTIREPORTER - }; - gfxPlatformFontList(bool aNeedFullnamePostscriptNames = true); static gfxPlatformFontList *sPlatformFontList; @@ -226,13 +200,6 @@ protected: virtual bool RunLoader(); virtual void FinishLoader(); - // used by memory reporter to accumulate sizes of family names in the hash - static size_t - SizeOfFamilyNameEntryExcludingThis(const nsAString& aKey, - const nsRefPtr& aFamily, - nsMallocSizeOfFun aMallocSizeOf, - void* aUserArg); - // canonical family name ==> family entry (unique, one name per family entry) nsRefPtrHashtable mFontFamilies; diff --git a/xpcom/glue/nsBaseHashtable.h b/xpcom/glue/nsBaseHashtable.h index 4d0ec87ee37..6ab8590865a 100644 --- a/xpcom/glue/nsBaseHashtable.h +++ b/xpcom/glue/nsBaseHashtable.h @@ -272,17 +272,16 @@ public: * @return the summed size of all the entries */ size_t SizeOfExcludingThis(SizeOfEntryExcludingThisFun sizeOfEntryExcludingThis, - nsMallocSizeOfFun mallocSizeOf, void *userArg = nsnull) const + nsMallocSizeOfFun mallocSizeOf, void *userArg = nsnull) { - if (!IsInitialized()) { - return 0; - } - if (sizeOfEntryExcludingThis) { + if (IsInitialized()) { s_SizeOfArgs args = { sizeOfEntryExcludingThis, userArg }; - return PL_DHashTableSizeOfExcludingThis(&this->mTable, s_SizeOfStub, - mallocSizeOf, &args); + return PL_DHashTableSizeOfExcludingThis(&this->mTable, + s_SizeOfStub, + mallocSizeOf, + &args); } - return PL_DHashTableSizeOfExcludingThis(&this->mTable, NULL, mallocSizeOf); + return 0; } protected: diff --git a/xpcom/glue/nsTHashtable.h b/xpcom/glue/nsTHashtable.h index e2a00135858..762517fb0aa 100644 --- a/xpcom/glue/nsTHashtable.h +++ b/xpcom/glue/nsTHashtable.h @@ -288,14 +288,11 @@ public: size_t SizeOfExcludingThis(SizeOfEntryExcludingThisFun sizeOfEntryExcludingThis, nsMallocSizeOfFun mallocSizeOf, void *userArg = NULL) const { - if (!IsInitialized()) { - return 0; - } - if (sizeOfEntryExcludingThis) { + if (IsInitialized()) { s_SizeOfArgs args = { sizeOfEntryExcludingThis, userArg }; return PL_DHashTableSizeOfExcludingThis(&mTable, s_SizeOfStub, mallocSizeOf, &args); } - return PL_DHashTableSizeOfExcludingThis(&mTable, NULL, mallocSizeOf); + return 0; } #ifdef DEBUG