From 945c4237b2d712e2149e4e504aca59fbd7acd0ae Mon Sep 17 00:00:00 2001 From: "danm%netscape.com" Date: Wed, 11 Sep 2002 02:35:26 +0000 Subject: [PATCH] just because an observer supports weak refs doesn't mean it is one. (found while leak hunting in) bug 166442 r=jag,jst git-svn-id: svn://10.0.0.236/trunk@129219 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/xpcom/ds/nsObserverList.cpp | 36 ++++++++++++++++------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/mozilla/xpcom/ds/nsObserverList.cpp b/mozilla/xpcom/ds/nsObserverList.cpp index ada9d755c55..7701c58d181 100644 --- a/mozilla/xpcom/ds/nsObserverList.cpp +++ b/mozilla/xpcom/ds/nsObserverList.cpp @@ -60,16 +60,16 @@ nsObserverList::~nsObserverList(void) nsresult nsObserverList::AddObserver(nsIObserver* anObserver, PRBool ownsWeak) { - nsresult rv; - PRBool inserted; + nsresult rv; + PRBool inserted; NS_ENSURE_ARG(anObserver); - - nsAutoLock lock(mLock); - if (!mObserverList) { + nsAutoLock lock(mLock); + + if (!mObserverList) { rv = NS_NewISupportsArray(getter_AddRefs(mObserverList)); - if (NS_FAILED(rv)) return rv; + if (NS_FAILED(rv)) return rv; } #ifdef NS_WEAK_OBSERVERS @@ -92,8 +92,8 @@ nsObserverList::AddObserver(nsIObserver* anObserver, PRBool ownsWeak) inserted = mObserverList->AppendElement(observerRef); #else - if(*anObserver) - inserted = mObserverList->AppendElement(*anObserver); + if (*anObserver) + inserted = mObserverList->AppendElement(*anObserver); #endif return inserted ? NS_OK : NS_ERROR_FAILURE; } @@ -105,23 +105,27 @@ nsObserverList::RemoveObserver(nsIObserver* anObserver) NS_ENSURE_ARG(anObserver); - nsAutoLock lock(mLock); + nsAutoLock lock(mLock); if (!mObserverList) - return NS_ERROR_FAILURE; + return NS_ERROR_FAILURE; #ifdef NS_WEAK_OBSERVERS nsCOMPtr weakRefFactory = do_QueryInterface(anObserver); nsCOMPtr observerRef; - if ( weakRefFactory ) + if (weakRefFactory) { observerRef = getter_AddRefs(NS_STATIC_CAST(nsISupports*, NS_GetWeakReference(weakRefFactory))); - else + if (observerRef) + removed = mObserverList->RemoveElement(observerRef); + if (!removed) + observerRef = anObserver; + } else observerRef = anObserver; - - if(observerRef) - removed = mObserverList->RemoveElement(observerRef); + + if (!removed && observerRef) + removed = mObserverList->RemoveElement(observerRef); #else - if(*anObserver) + if (*anObserver) removed = mObserverList->RemoveElement(*anObserver); #endif return removed ? NS_OK : NS_ERROR_FAILURE;