0

Mark ObserverList DCHECK stacks as expensive

This puts ObserverList StackTrace gathering under
EXPENSIVE_DCHECKS_ARE_ON() to be able to selectively exclude them
without disabling DCHECKs.

Anecdotal data (off-the-tracker) suggest that this is one of the top-10
overheads for running with DCHECKs right now.

Bug: None
Change-Id: Ife3cbc4326d84f8af1e3ea67e94791a02e35b304
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3017493
Reviewed-by: danakj <danakj@chromium.org>
Commit-Queue: Peter Boström <pbos@chromium.org>
Cr-Commit-Position: refs/heads/master@{#900121}
This commit is contained in:
Peter Boström
2021-07-09 20:24:16 +00:00
committed by Chromium LUCI CQ
parent ba6ecee942
commit 51b93219e5
2 changed files with 9 additions and 6 deletions

@ -336,14 +336,17 @@ class ObserverList {
}
std::string GetObserversCreationStackString() const {
#if EXPENSIVE_DCHECKS_ARE_ON()
std::string result;
#if DCHECK_IS_ON()
for (const auto& observer : observers_) {
result += observer.GetCreationStackString();
result += "\n";
}
#endif
return result;
#else
return "For observer stack traces, build with "
"`enable_expensive_dchecks=true`.";
#endif // EXPENSIVE_DCHECKS_ARE_ON()
}
std::vector<ObserverStorageType> observers_;

@ -42,15 +42,15 @@ class BASE_EXPORT UncheckedObserverAdapter {
return static_cast<ObserverType*>(adapter.ptr_);
}
#if DCHECK_IS_ON()
#if EXPENSIVE_DCHECKS_ARE_ON()
std::string GetCreationStackString() const { return stack_.ToString(); }
#endif
#endif // EXPENSIVE_DCHECKS_ARE_ON()
private:
void* ptr_;
#if DCHECK_IS_ON()
#if EXPENSIVE_DCHECKS_ARE_ON()
base::debug::StackTrace stack_;
#endif
#endif // EXPENSIVE_DCHECKS_ARE_ON()
};
// Adapter for CheckedObserver types so that they can use the same syntax as a