fix 101143 r=dp, sr=waterson shutdown observer skipped if previous observer removes itself upon shutdown notification

git-svn-id: svn://10.0.0.236/trunk@103656 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
bienvenu%netscape.com
2001-09-24 23:07:44 +00:00
parent 62bc92111a
commit fbec06d22e

View File

@@ -224,6 +224,7 @@ NS_IMETHODIMP nsObserverService::Notify( nsISupports *aSubject,
rv = observers->First();
// Continue until error or end of list.
while ( observers->IsDone() != NS_OK && NS_SUCCEEDED(rv) ) {
PRBool advanceToNext = PR_TRUE;
// Get current item (observer).
nsISupports *base;
rv = observers->CurrentItem( &base );
@@ -234,13 +235,19 @@ NS_IMETHODIMP nsObserverService::Notify( nsISupports *aSubject,
if ( NS_SUCCEEDED( rv ) && observer ) {
// Tell the observer what's up.
observer->Observe( aSubject, aTopic, someData );
nsCOMPtr <nsISupports> currentItem;
observers->CurrentItem(getter_AddRefs(currentItem));
// check if the current item has changed, because the
// observer removed the old current item.
advanceToNext = (currentItem == base);
// Release the observer.
observer->Release();
}
NS_IF_RELEASE(base);
}
// Go on to next observer in list.
rv = observers->Next();
if (advanceToNext)
rv = observers->Next();
}
// Release the observer list.
observers->Release();