зеркало из https://github.com/mozilla/gecko-dev.git
Bug 660640 part.1 RemoveObserver(), RemoveObservers() and UnregisterCallback() shouldn't output warnings if it failed after shutdown r=roc
This commit is contained in:
Родитель
a145ce7483
Коммит
dcb177702c
|
@ -97,7 +97,11 @@ public:
|
|||
* Returns shared pref service instance
|
||||
* NOTE: not addreffed.
|
||||
*/
|
||||
static nsIPrefService* GetService() { return sPreferences; }
|
||||
static nsIPrefService* GetService()
|
||||
{
|
||||
NS_ENSURE_TRUE(InitStaticMembers(), nsnull);
|
||||
return sPreferences;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns shared pref branch instance.
|
||||
|
@ -105,7 +109,8 @@ public:
|
|||
*/
|
||||
static nsIPrefBranch2* GetRootBranch()
|
||||
{
|
||||
return sPreferences ? sPreferences->mRootBranch.get() : nsnull;
|
||||
NS_ENSURE_TRUE(InitStaticMembers(), nsnull);
|
||||
return sPreferences->mRootBranch.get();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -193,13 +193,13 @@ static nsRefPtrHashtable<ValueObserverHashKey,
|
|||
Preferences*
|
||||
Preferences::GetInstance()
|
||||
{
|
||||
NS_ENSURE_TRUE(!sShutdown, nsnull);
|
||||
|
||||
if (sPreferences) {
|
||||
NS_ADDREF(sPreferences);
|
||||
return sPreferences;
|
||||
}
|
||||
|
||||
NS_ENSURE_TRUE(!sShutdown, nsnull);
|
||||
|
||||
InitStaticMembers();
|
||||
NS_IF_ADDREF(sPreferences);
|
||||
return sPreferences;
|
||||
|
@ -232,14 +232,16 @@ Preferences::InitStaticMembers()
|
|||
void
|
||||
Preferences::Shutdown()
|
||||
{
|
||||
sShutdown = PR_TRUE; // Don't create the singleton instance after here.
|
||||
NS_IF_RELEASE(sPreferences);
|
||||
if (!sShutdown ) {
|
||||
sShutdown = PR_TRUE; // Don't create the singleton instance after here.
|
||||
|
||||
delete gCacheData;
|
||||
gCacheData = nsnull;
|
||||
|
||||
delete gObserverTable;
|
||||
gObserverTable = nsnull;
|
||||
// Don't set NULL to sPreferences here. The instance may be grabbed by
|
||||
// other modules. The utility methods of Preferences should be available
|
||||
// until the singleton instance actually released.
|
||||
if (sPreferences) {
|
||||
sPreferences->Release();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
@ -254,6 +256,16 @@ Preferences::Preferences()
|
|||
|
||||
Preferences::~Preferences()
|
||||
{
|
||||
NS_ASSERTION(sPreferences == this, "Isn't this the singleton instance?");
|
||||
|
||||
delete gObserverTable;
|
||||
gObserverTable = nsnull;
|
||||
|
||||
delete gCacheData;
|
||||
gCacheData = nsnull;
|
||||
|
||||
sPreferences = nsnull;
|
||||
|
||||
PREF_Cleanup();
|
||||
}
|
||||
|
||||
|
@ -1322,7 +1334,10 @@ nsresult
|
|||
Preferences::RemoveObserver(nsIObserver* aObserver,
|
||||
const char* aPref)
|
||||
{
|
||||
NS_ENSURE_TRUE(InitStaticMembers(), NS_ERROR_NOT_AVAILABLE);
|
||||
if (!sPreferences && sShutdown) {
|
||||
return NS_OK; // Observers have been released automatically.
|
||||
}
|
||||
NS_ENSURE_TRUE(sPreferences, NS_ERROR_NOT_AVAILABLE);
|
||||
return sPreferences->mRootBranch->RemoveObserver(aPref, aObserver);
|
||||
}
|
||||
|
||||
|
@ -1355,6 +1370,11 @@ nsresult
|
|||
Preferences::RemoveObservers(nsIObserver* aObserver,
|
||||
const char** aPrefs)
|
||||
{
|
||||
if (!sPreferences && sShutdown) {
|
||||
return NS_OK; // Observers have been released automatically.
|
||||
}
|
||||
NS_ENSURE_TRUE(sPreferences, NS_ERROR_NOT_AVAILABLE);
|
||||
|
||||
for (PRUint32 i = 0; aPrefs[i]; i++) {
|
||||
nsresult rv = RemoveObserver(aObserver, aPrefs[i]);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
@ -1392,7 +1412,10 @@ Preferences::UnregisterCallback(PrefChangedFunc aCallback,
|
|||
const char* aPref,
|
||||
void* aClosure)
|
||||
{
|
||||
NS_ENSURE_TRUE(InitStaticMembers(), NS_ERROR_NOT_AVAILABLE);
|
||||
if (!sPreferences && sShutdown) {
|
||||
return NS_OK; // Observers have been released automatically.
|
||||
}
|
||||
NS_ENSURE_TRUE(sPreferences, NS_ERROR_NOT_AVAILABLE);
|
||||
|
||||
ValueObserverHashKey hashKey(aPref, aCallback);
|
||||
nsRefPtr<ValueObserver> observer;
|
||||
|
|
|
@ -71,7 +71,6 @@ static void
|
|||
UnloadPrefsModule()
|
||||
{
|
||||
Preferences::Shutdown();
|
||||
PREF_Cleanup();
|
||||
}
|
||||
|
||||
static const mozilla::Module kPrefModule = {
|
||||
|
|
Загрузка…
Ссылка в новой задаче