summaryrefslogtreecommitdiffstats
path: root/base/observer_list_threadsafe.h
diff options
context:
space:
mode:
authorwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-17 19:33:06 +0000
committerwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-17 19:33:06 +0000
commit3c0d45e1a201dfabfefecf3f2bb81411b0272c37 (patch)
treefe73f0c57428370b71fe5b97403a10eb0e118704 /base/observer_list_threadsafe.h
parent3e5fe0f02d7347d2d913f237ad8f06cb8a9defec (diff)
downloadchromium_src-3c0d45e1a201dfabfefecf3f2bb81411b0272c37.zip
chromium_src-3c0d45e1a201dfabfefecf3f2bb81411b0272c37.tar.gz
chromium_src-3c0d45e1a201dfabfefecf3f2bb81411b0272c37.tar.bz2
Fix removal of multiple observers in ObserverListThreadSafe.
BUG=55725 TEST=ObserverListThreadSafeTest.RemoveMultipleObservers Review URL: http://codereview.chromium.org/3381009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@59833 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/observer_list_threadsafe.h')
-rw-r--r--base/observer_list_threadsafe.h9
1 files changed, 5 insertions, 4 deletions
diff --git a/base/observer_list_threadsafe.h b/base/observer_list_threadsafe.h
index 94c55a6..d034e6c 100644
--- a/base/observer_list_threadsafe.h
+++ b/base/observer_list_threadsafe.h
@@ -182,15 +182,16 @@ class ObserverListThreadSafe
// If there are no more observers on the list, we can now delete it.
if (list->size() == 0) {
-#ifndef NDEBUG
{
AutoLock lock(list_lock_);
- // Verify this list is no longer registered.
+ // Remove |list| if it's not already removed.
+ // This can happen if multiple observers got removed in a notification.
+ // See http://crbug.com/55725.
typename ObserversListMap::iterator it =
observer_lists_.find(MessageLoop::current());
- DCHECK(it == observer_lists_.end() || it->second != list);
+ if (it != observer_lists_.end() && it->second == list)
+ observer_lists_.erase(it);
}
-#endif
delete list;
}
}