author | Nicholas Nethercote <nnethercote@mozilla.com> |
Wed, 01 Nov 2017 13:41:14 +1100 | |
changeset 389916 | 352bbd41f1fa04267235faeec42dd463bcf8118a |
parent 389915 | 008cf4865cb5cfd7766a7367875e184cf013c1c5 |
child 389917 | 962343e8bdf0f90916487fcf81908589d70ff51f |
push id | 96950 |
push user | nnethercote@mozilla.com |
push date | Thu, 02 Nov 2017 23:20:36 +0000 |
treeherder | mozilla-inbound@962343e8bdf0 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | froydnj |
bugs | 1413400 |
milestone | 58.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
modules/libpref/Preferences.cpp | file | annotate | diff | comparison | revisions | |
modules/libpref/Preferences.h | file | annotate | diff | comparison | revisions |
--- a/modules/libpref/Preferences.cpp +++ b/modules/libpref/Preferences.cpp @@ -3207,18 +3207,16 @@ static const char kPrefFileHeader[] = "about:config" NS_LINEBREAK " */" NS_LINEBREAK NS_LINEBREAK; // clang-format on Preferences* Preferences::sPreferences = nullptr; -nsIPrefBranch* Preferences::sRootBranch = nullptr; -nsIPrefBranch* Preferences::sDefaultRootBranch = nullptr; bool Preferences::sShutdown = false; // This globally enables or disables OMT pref writing, both sync and async. static int32_t sAllowOMTPrefWrite = -1; class ValueObserverHashKey : public PLDHashEntryHdr { public: @@ -3541,23 +3539,23 @@ Preferences::SizeOfIncludingThisAndOther if (gObserverTable) { n += gObserverTable->ShallowSizeOfIncludingThis(aMallocSizeOf); for (auto iter = gObserverTable->Iter(); !iter.Done(); iter.Next()) { n += iter.Key()->mPrefName.SizeOfExcludingThisIfUnshared(aMallocSizeOf); n += iter.Data()->mClosures.ShallowSizeOfExcludingThis(aMallocSizeOf); } } - if (sRootBranch) { - n += reinterpret_cast<nsPrefBranch*>(sRootBranch) + if (sPreferences->mRootBranch) { + n += static_cast<nsPrefBranch*>(sPreferences->mRootBranch.get()) ->SizeOfIncludingThis(aMallocSizeOf); } - if (sDefaultRootBranch) { - n += reinterpret_cast<nsPrefBranch*>(sDefaultRootBranch) + if (sPreferences->mDefaultRootBranch) { + n += static_cast<nsPrefBranch*>(sPreferences->mDefaultRootBranch.get()) ->SizeOfIncludingThis(aMallocSizeOf); } n += pref_SizeOfPrivateData(aMallocSizeOf); return n; } @@ -3704,27 +3702,21 @@ Preferences::GetInstanceForService() return do_AddRef(sPreferences); } if (sShutdown) { gCacheDataDesc = "shutting down in GetInstanceForService()"; return nullptr; } - sRootBranch = new nsPrefBranch("", false); - NS_ADDREF(sRootBranch); - sDefaultRootBranch = new nsPrefBranch("", true); - NS_ADDREF(sDefaultRootBranch); - sPreferences = new Preferences(); NS_ADDREF(sPreferences); Result<Ok, const char*> res = sPreferences->Init(); if (res.isErr()) { - // The singleton instance will delete sRootBranch and sDefaultRootBranch. gCacheDataDesc = res.unwrapErr(); NS_RELEASE(sPreferences); return nullptr; } gCacheData = new nsTArray<nsAutoPtr<CacheData>>(); gCacheDataDesc = "set by GetInstanceForService()"; @@ -3777,31 +3769,32 @@ Preferences::Shutdown() } //----------------------------------------------------------------------------- // // Constructor/Destructor // -Preferences::Preferences() = default; +Preferences::Preferences() + : mRootBranch(new nsPrefBranch("", false)) + , mDefaultRootBranch(new nsPrefBranch("", true)) +{ +} Preferences::~Preferences() { NS_ASSERTION(sPreferences == this, "Isn't this the singleton instance?"); delete gObserverTable; gObserverTable = nullptr; delete gCacheData; gCacheData = nullptr; - NS_RELEASE(sRootBranch); - NS_RELEASE(sDefaultRootBranch); - sPreferences = nullptr; PREF_Cleanup(); } // // nsISupports Implementation // @@ -4165,28 +4158,28 @@ Preferences::GetBranch(const char* aPref { if ((nullptr != aPrefRoot) && (*aPrefRoot != '\0')) { // TODO: Cache this stuff and allow consumers to share branches (hold weak // references, I think). RefPtr<nsPrefBranch> prefBranch = new nsPrefBranch(aPrefRoot, false); prefBranch.forget(aRetVal); } else { // Special case: caching the default root. - nsCOMPtr<nsIPrefBranch> root(sRootBranch); + nsCOMPtr<nsIPrefBranch> root(sPreferences->mRootBranch); root.forget(aRetVal); } return NS_OK; } NS_IMETHODIMP Preferences::GetDefaultBranch(const char* aPrefRoot, nsIPrefBranch** aRetVal) { if (!aPrefRoot || !aPrefRoot[0]) { - nsCOMPtr<nsIPrefBranch> root(sDefaultRootBranch); + nsCOMPtr<nsIPrefBranch> root(sPreferences->mDefaultRootBranch); root.forget(aRetVal); return NS_OK; } // TODO: Cache this stuff and allow consumers to share branches (hold weak // references, I think). RefPtr<nsPrefBranch> prefBranch = new nsPrefBranch(aPrefRoot, true); if (!prefBranch) { @@ -4860,30 +4853,30 @@ Preferences::GetLocalizedCString(const c return rv; } /* static */ nsresult Preferences::GetLocalizedString(const char* aPref, nsAString& aResult) { NS_ENSURE_TRUE(InitStaticMembers(), NS_ERROR_NOT_AVAILABLE); nsCOMPtr<nsIPrefLocalizedString> prefLocalString; - nsresult rv = sRootBranch->GetComplexValue( + nsresult rv = sPreferences->mRootBranch->GetComplexValue( aPref, NS_GET_IID(nsIPrefLocalizedString), getter_AddRefs(prefLocalString)); if (NS_SUCCEEDED(rv)) { NS_ASSERTION(prefLocalString, "Succeeded but the result is NULL"); prefLocalString->GetData(aResult); } return rv; } /* static */ nsresult Preferences::GetComplex(const char* aPref, const nsIID& aType, void** aResult) { NS_ENSURE_TRUE(InitStaticMembers(), NS_ERROR_NOT_AVAILABLE); - return sRootBranch->GetComplexValue(aPref, aType, aResult); + return sPreferences->mRootBranch->GetComplexValue(aPref, aType, aResult); } /* static */ nsresult Preferences::SetCString(const char* aPref, const char* aValue) { ENSURE_MAIN_PROCESS_WITH_WARNING("SetCString", aPref); NS_ENSURE_TRUE(InitStaticMembers(), NS_ERROR_NOT_AVAILABLE); return PREF_SetCStringPref(aPref, nsDependentCString(aValue), false); @@ -4936,17 +4929,17 @@ Preferences::SetFloat(const char* aPref, } /* static */ nsresult Preferences::SetComplex(const char* aPref, const nsIID& aType, nsISupports* aValue) { NS_ENSURE_TRUE(InitStaticMembers(), NS_ERROR_NOT_AVAILABLE); - return sRootBranch->SetComplexValue(aPref, aType, aValue); + return sPreferences->mRootBranch->SetComplexValue(aPref, aType, aValue); } /* static */ nsresult Preferences::ClearUser(const char* aPref) { ENSURE_MAIN_PROCESS_WITH_WARNING("ClearUser", aPref); NS_ENSURE_TRUE(InitStaticMembers(), NS_ERROR_NOT_AVAILABLE); return PREF_ClearUserPref(aPref); @@ -4959,46 +4952,46 @@ Preferences::HasUserValue(const char* aP return PREF_HasUserPref(aPref); } /* static */ int32_t Preferences::GetType(const char* aPref) { NS_ENSURE_TRUE(InitStaticMembers(), nsIPrefBranch::PREF_INVALID); int32_t result; - return NS_SUCCEEDED(sRootBranch->GetPrefType(aPref, &result)) + return NS_SUCCEEDED(sPreferences->mRootBranch->GetPrefType(aPref, &result)) ? result : nsIPrefBranch::PREF_INVALID; } /* static */ nsresult Preferences::AddStrongObserver(nsIObserver* aObserver, const char* aPref) { MOZ_ASSERT(aObserver); NS_ENSURE_TRUE(InitStaticMembers(), NS_ERROR_NOT_AVAILABLE); - return sRootBranch->AddObserver(aPref, aObserver, false); + return sPreferences->mRootBranch->AddObserver(aPref, aObserver, false); } /* static */ nsresult Preferences::AddWeakObserver(nsIObserver* aObserver, const char* aPref) { MOZ_ASSERT(aObserver); NS_ENSURE_TRUE(InitStaticMembers(), NS_ERROR_NOT_AVAILABLE); - return sRootBranch->AddObserver(aPref, aObserver, true); + return sPreferences->mRootBranch->AddObserver(aPref, aObserver, true); } /* static */ nsresult Preferences::RemoveObserver(nsIObserver* aObserver, const char* aPref) { MOZ_ASSERT(aObserver); if (!sPreferences && sShutdown) { return NS_OK; // Observers have been released automatically. } NS_ENSURE_TRUE(sPreferences, NS_ERROR_NOT_AVAILABLE); - return sRootBranch->RemoveObserver(aPref, aObserver); + return sPreferences->mRootBranch->RemoveObserver(aPref, aObserver); } /* static */ nsresult Preferences::AddStrongObservers(nsIObserver* aObserver, const char** aPrefs) { MOZ_ASSERT(aObserver); for (uint32_t i = 0; aPrefs[i]; i++) { nsresult rv = AddStrongObserver(aObserver, aPrefs[i]); @@ -5335,40 +5328,42 @@ Preferences::GetDefaultLocalizedCString( return rv; } /* static */ nsresult Preferences::GetDefaultLocalizedString(const char* aPref, nsAString& aResult) { NS_ENSURE_TRUE(InitStaticMembers(), NS_ERROR_NOT_AVAILABLE); nsCOMPtr<nsIPrefLocalizedString> prefLocalString; - nsresult rv = sDefaultRootBranch->GetComplexValue( + nsresult rv = sPreferences->mDefaultRootBranch->GetComplexValue( aPref, NS_GET_IID(nsIPrefLocalizedString), getter_AddRefs(prefLocalString)); if (NS_SUCCEEDED(rv)) { NS_ASSERTION(prefLocalString, "Succeeded but the result is NULL"); prefLocalString->GetData(aResult); } return rv; } /* static */ nsresult Preferences::GetDefaultComplex(const char* aPref, const nsIID& aType, void** aResult) { NS_ENSURE_TRUE(InitStaticMembers(), NS_ERROR_NOT_AVAILABLE); - return sDefaultRootBranch->GetComplexValue(aPref, aType, aResult); + return sPreferences->mDefaultRootBranch->GetComplexValue( + aPref, aType, aResult); } /* static */ int32_t Preferences::GetDefaultType(const char* aPref) { NS_ENSURE_TRUE(InitStaticMembers(), nsIPrefBranch::PREF_INVALID); int32_t result; - return NS_SUCCEEDED(sDefaultRootBranch->GetPrefType(aPref, &result)) + return NS_SUCCEEDED( + sPreferences->mDefaultRootBranch->GetPrefType(aPref, &result)) ? result : nsIPrefBranch::PREF_INVALID; } } // namespace mozilla #undef ENSURE_MAIN_PROCESS #undef ENSURE_MAIN_PROCESS_WITH_WARNING
--- a/modules/libpref/Preferences.h +++ b/modules/libpref/Preferences.h @@ -59,17 +59,17 @@ class Preferences final , public nsIPrefBranch , public nsSupportsWeakReference { public: typedef mozilla::dom::PrefSetting PrefSetting; NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSIPREFSERVICE - NS_FORWARD_NSIPREFBRANCH(sRootBranch->) + NS_FORWARD_NSIPREFBRANCH(mRootBranch->) NS_DECL_NSIOBSERVER Preferences(); mozilla::Result<Ok, const char*> Init(); // Returns true if the Preferences service is available, false otherwise. static bool IsServiceAvailable(); @@ -89,24 +89,24 @@ public: NS_ENSURE_TRUE(InitStaticMembers(), nullptr); return sPreferences; } // Returns shared pref branch instance. NOTE: not addreffed. static nsIPrefBranch* GetRootBranch() { NS_ENSURE_TRUE(InitStaticMembers(), nullptr); - return sRootBranch; + return sPreferences->mRootBranch; } // Returns shared default pref branch instance. NOTE: not addreffed. static nsIPrefBranch* GetDefaultRootBranch() { NS_ENSURE_TRUE(InitStaticMembers(), nullptr); - return sDefaultRootBranch; + return sPreferences->mDefaultRootBranch; } // Gets int or bool type pref value with default value if failed to get the // pref. static bool GetBool(const char* aPref, bool aDefault = false) { bool result = aDefault; GetBool(aPref, &result); @@ -398,19 +398,20 @@ protected: private: nsCOMPtr<nsIFile> mCurrentFile; bool mDirty = false; bool mProfileShutdown = false; // We wait a bit after prefs are dirty before writing them. In this period, // mDirty and mSavePending will both be true. bool mSavePending = false; + nsCOMPtr<nsIPrefBranch> mRootBranch; + nsCOMPtr<nsIPrefBranch> mDefaultRootBranch; + static Preferences* sPreferences; - static nsIPrefBranch* sRootBranch; - static nsIPrefBranch* sDefaultRootBranch; static bool sShutdown; // Init static members. Returns true on success. static bool InitStaticMembers(); }; } // namespace mozilla