diff options
author | jar@chromium.org <jar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-13 14:13:43 +0000 |
---|---|---|
committer | jar@chromium.org <jar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-13 14:13:43 +0000 |
commit | fde0830ad20fb1b7f8734e79eedef4d2f684c910 (patch) | |
tree | 31372dea05f60a555da70528dc8963ee403c3829 /base | |
parent | 4d84b1bbfcc170224a0d42a6206fb9a0af2f90cc (diff) | |
download | chromium_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')
-rw-r--r-- | base/observer_list.h | 18 |
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__ |