summaryrefslogtreecommitdiffstats
path: root/base/observer_list.h
diff options
context:
space:
mode:
authorjar@chromium.org <jar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-13 14:13:43 +0000
committerjar@chromium.org <jar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-13 14:13:43 +0000
commitfde0830ad20fb1b7f8734e79eedef4d2f684c910 (patch)
tree31372dea05f60a555da70528dc8963ee403c3829 /base/observer_list.h
parent4d84b1bbfcc170224a0d42a6206fb9a0af2f90cc (diff)
downloadchromium_src-fde0830ad20fb1b7f8734e79eedef4d2f684c910.zip
chromium_src-fde0830ad20fb1b7f8734e79eedef4d2f684c910.tar.gz
chromium_src-fde0830ad20fb1b7f8734e79eedef4d2f684c910.tar.bz2
Speed up observers list notifcation macro when list is empty
When an observer list is empty (as is the case in the heart of the message loop code, surronding Run()).... This reduces somthing in the range of 100+ (perhaps 1000+) out-of-line assembly instructions (including over a dozen slow atomic operations, a malloc, and a free), down to 4 inline assembly instructions. r=darin BUG=100121 Review URL: http://codereview.chromium.org/8262002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@105302 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/observer_list.h')
-rw-r--r--base/observer_list.h18
1 files changed, 12 insertions, 6 deletions
diff --git a/base/observer_list.h b/base/observer_list.h
index d30cc6e..22b9ed2 100644
--- a/base/observer_list.h
+++ b/base/observer_list.h
@@ -203,14 +203,20 @@ class ObserverList : public ObserverListBase<ObserverType> {
DCHECK_EQ(ObserverListBase<ObserverType>::size(), 0U);
}
}
+
+ bool might_have_observers() const {
+ return ObserverListBase<ObserverType>::size() != 0;
+ }
};
-#define FOR_EACH_OBSERVER(ObserverType, observer_list, func) \
- do { \
- ObserverListBase<ObserverType>::Iterator it(observer_list); \
- ObserverType* obs; \
- while ((obs = it.GetNext()) != NULL) \
- obs->func; \
+#define FOR_EACH_OBSERVER(ObserverType, observer_list, func) \
+ do { \
+ if ((observer_list).might_have_observers()) { \
+ ObserverListBase<ObserverType>::Iterator it(observer_list); \
+ ObserverType* obs; \
+ while ((obs = it.GetNext()) != NULL) \
+ obs->func; \
+ } \
} while (0)
#endif // BASE_OBSERVER_LIST_H__