Bug 660640 part.1 RemoveObserver(), RemoveObservers() and UnregisterCallback() shouldn't output warnings if it failed after shutdown r=roc

This commit is contained in:
Masayuki Nakano 2011-06-03 15:01:02 +09:00
Родитель a145ce7483
Коммит dcb177702c
3 изменённых файлов: 41 добавлений и 14 удалений

Просмотреть файл

@ -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 = {