Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2398)

Unified Diff: base/debug/trace_event_impl.cc

Issue 11823016: Trace category groups and category filter. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Category group and category filter basics. Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/debug/trace_event_impl.h ('k') | base/debug/trace_event_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/debug/trace_event_impl.cc
diff --git a/base/debug/trace_event_impl.cc b/base/debug/trace_event_impl.cc
index cbcf54b81c6aac08b08d5f71fb6796f6869b84de..9a89fef39512a5b8728c181ad5480a58e26b47bf 100644
--- a/base/debug/trace_event_impl.cc
+++ b/base/debug/trace_event_impl.cc
@@ -396,29 +396,18 @@ const char* TraceLog::GetCategoryName(const unsigned char* category_enabled) {
return g_categories[category_index];
}
-static void EnableMatchingCategory(int category_index,
- const std::vector<std::string>& patterns,
- unsigned char matched_value,
- unsigned char unmatched_value) {
- std::vector<std::string>::const_iterator ci = patterns.begin();
- bool is_match = false;
- for (; ci != patterns.end(); ++ci) {
- is_match = MatchPattern(g_categories[category_index], ci->c_str());
- if (is_match)
- break;
- }
- g_category_enabled[category_index] = is_match ?
- matched_value : unmatched_value;
+void TraceLog::EnableIncludedCategoryGroup(int category_index,
+ const CategoryFilter& category_filter) {
+ bool is_enabled =
+ category_filter.IsCategoryGroupEnabled(g_categories[category_index]);
+ g_category_enabled[category_index] = is_enabled ?
+ TraceLog::CATEGORY_ENABLED : 0;
}
-// Enable/disable each category based on the category filters in |patterns|.
-// If the category name matches one of the patterns, its enabled status is set
-// to |matched_value|. Otherwise its enabled status is set to |unmatched_value|.
-static void EnableMatchingCategories(const std::vector<std::string>& patterns,
- unsigned char matched_value,
- unsigned char unmatched_value) {
+void TraceLog::EnableIncludedCategoryGroups(
+ const CategoryFilter& category_filter) {
for (int i = 0; i < g_category_index; i++)
- EnableMatchingCategory(i, patterns, matched_value, unmatched_value);
+ EnableIncludedCategoryGroup(i, category_filter);
}
const unsigned char* TraceLog::GetCategoryEnabledInternal(const char* name) {
@@ -448,15 +437,10 @@ const unsigned char* TraceLog::GetCategoryEnabledInternal(const char* name) {
g_categories[new_index] = new_name;
DCHECK(!g_category_enabled[new_index]);
if (enable_count_) {
- // Note that if both included and excluded_categories are empty, the
- // else clause below excludes nothing, thereby enabling this category.
- if (!included_categories_.empty()) {
- EnableMatchingCategory(new_index, included_categories_,
- CATEGORY_ENABLED, 0);
- } else {
- EnableMatchingCategory(new_index, excluded_categories_,
- 0, CATEGORY_ENABLED);
- }
+ // Note that if both included and excluded patterns in the
+ // CategoryFilter are empty, we exclude nothing,
+ // thereby enabling this category group.
+ EnableIncludedCategoryGroup(new_index, category_filter_);
} else {
g_category_enabled[new_index] = 0;
}
@@ -477,24 +461,135 @@ void TraceLog::GetKnownCategories(std::vector<std::string>* categories) {
categories->push_back(g_categories[i]);
}
-void TraceLog::SetEnabled(const std::vector<std::string>& included_categories,
- const std::vector<std::string>& excluded_categories) {
+static bool DoesCategoryGroupContainCategory(const char* category_group,
+ const char* category) {
rterrazas 2013/02/21 04:08:05 So...I was thinking, I'd like to change this to so
nduca 2013/02/22 19:55:19 This sounds like a metho don the CategoryFilter ob
+ DCHECK(category);
+ CStringTokenizer category_group_tokens(category_group,
+ category_group + strlen(category_group), ",");
+ while (category_group_tokens.GetNext()) {
+ std::string category_group_token = category_group_tokens.token();
+ // Don't allow empty tokens, nor tokens with leading or trailing space.
+ DCHECK(!category_group_token.empty() &&
+ category_group_token.at(0) != ' '&&
+ category_group_token.at(category_group_token.length() - 1) != ' ')
+ << "Disallowed category string";
+ if (MatchPattern(category_group_token.c_str(), category))
+ return true;
+ }
+ return false;
+}
+
+const char* CategoryFilter::kDefaultCategoryFilterString = "-*Debug,-*Test";
+
+CategoryFilter::CategoryFilter() {
+ Initialize(CategoryFilter::kDefaultCategoryFilterString);
+}
+
+CategoryFilter::CategoryFilter(const std::string& filter_string) {
+ Initialize(filter_string);
+}
+
+void CategoryFilter::Initialize(const std::string& filter_string) {
+ // Pass 1: Tokenize list of categories, delimited by ','.
+ StringTokenizer tokens(filter_string, ",");
+ while (tokens.GetNext()) {
+ bool is_included = true;
+ std::string category = tokens.token();
+ // Ignore empty categories.
+ if(category.empty())
+ continue;
+ // Excluded categories start with '-'.
+ if (category.at(0) == '-') {
+ // Remove '-' from category string.
+ category = category.substr(1);
+ is_included = false;
+ }
+ if (is_included)
+ included_.push_back(category);
+ else
+ excluded_.push_back(category);
+ }
+}
+
+void CategoryFilter::WriteString(std::string* out,
+ bool included) const {
+ std::vector<std::string>::const_iterator ci;
+ std::vector<std::string>::const_iterator end;
+ if (included) {
+ ci = included_.begin();
+ end = included_.end();
+ } else {
+ ci = excluded_.begin();
+ end = excluded_.end();
+ }
+
+ for (; ci != end; ++ci) {
+ if (included)
+ StringAppendF(out, "%s,", ci->c_str());
+ else
+ StringAppendF(out, "-%s,", ci->c_str());
+ }
+}
+
+void CategoryFilter::ToString(std::string* filter_string) const {
+ WriteString(filter_string, true);
+ WriteString(filter_string, false);
+}
+
+bool CategoryFilter::IsCategoryGroupEnabled(const char* category_group_name)
rterrazas 2013/02/20 02:40:06 This does a lot of the work that was done through
+ const {
+ // TraceLog should call this method only as part of enabling/disabling
+ // categories.
+ std::vector<std::string>::const_iterator ci = included_.begin();
+ for (; ci != included_.end(); ++ci) {
+ if (DoesCategoryGroupContainCategory(category_group_name, ci->c_str()))
+ return true;
+ }
+ ci = excluded_.begin();
+ for (; ci != excluded_.end(); ++ci) {
+ if (DoesCategoryGroupContainCategory(category_group_name, ci->c_str()))
+ return false;
+ }
+ // If the category group is not excluded, and there are no included patterns
+ // we consider this pattern enabled.
+ return included_.empty();
+}
+
+void CategoryFilter::Merge(const CategoryFilter& nested_filter) {
+ included_.insert(included_.end(),
+ nested_filter.included_.begin(),
+ nested_filter.included_.end());
+ excluded_.insert(excluded_.end(),
+ nested_filter.excluded_.begin(),
+ nested_filter.excluded_.end());
+}
+
+bool CategoryFilter::HasIncludedCategories() const {
+ return !included_.empty();
+}
+
+void CategoryFilter::Clear() {
+ included_.clear();
+ excluded_.clear();
+}
+
+void TraceLog::SetEnabled(const CategoryFilter& category_filter) {
+
+ // Actually enable/disable the categories.
AutoLock lock(lock_);
if (enable_count_++ > 0) {
// Tracing is already enabled, so just merge in enabled categories.
// We only expand the set of enabled categories upon nested SetEnable().
- if (!included_categories_.empty() && !included_categories.empty()) {
- included_categories_.insert(included_categories_.end(),
- included_categories.begin(),
- included_categories.end());
- EnableMatchingCategories(included_categories_, CATEGORY_ENABLED, 0);
+ if (category_filter_.HasIncludedCategories() &&
+ category_filter.HasIncludedCategories()) {
+ category_filter_.Merge(category_filter);
} else {
- // If either old or new included categories are empty, allow all events.
- included_categories_.clear();
- excluded_categories_.clear();
- EnableMatchingCategories(excluded_categories_, 0, CATEGORY_ENABLED);
+ // If either old or new included categories are empty, allow all not
+ // excluded events.
+ category_filter_.Clear();
}
+ EnableIncludedCategoryGroups(category_filter_);
return;
}
@@ -510,45 +605,14 @@ void TraceLog::SetEnabled(const std::vector<std::string>& included_categories,
dispatching_to_observer_list_ = false;
logged_events_.reserve(1024);
- included_categories_ = included_categories;
- excluded_categories_ = excluded_categories;
- // Note that if both included and excluded_categories are empty, the else
- // clause below excludes nothing, thereby enabling all categories.
- if (!included_categories_.empty())
- EnableMatchingCategories(included_categories_, CATEGORY_ENABLED, 0);
- else
- EnableMatchingCategories(excluded_categories_, 0, CATEGORY_ENABLED);
-}
-
-void TraceLog::SetEnabled(const std::string& categories) {
- std::vector<std::string> included, excluded;
- // Tokenize list of categories, delimited by ','.
- StringTokenizer tokens(categories, ",");
- while (tokens.GetNext()) {
- bool is_included = true;
- std::string category = tokens.token();
- // Excluded categories start with '-'.
- if (category.at(0) == '-') {
- // Remove '-' from category string.
- category = category.substr(1);
- is_included = false;
- }
- if (is_included)
- included.push_back(category);
- else
- excluded.push_back(category);
- }
- SetEnabled(included, excluded);
+ category_filter_ = CategoryFilter(category_filter);
+ EnableIncludedCategoryGroups(category_filter_);
}
-void TraceLog::GetEnabledTraceCategories(
- std::vector<std::string>* included_out,
- std::vector<std::string>* excluded_out) {
+CategoryFilter& TraceLog::GetCurrentCategoryFilter() {
AutoLock lock(lock_);
- if (enable_count_) {
- *included_out = included_categories_;
- *excluded_out = excluded_categories_;
- }
+ DCHECK(enable_count_ > 0);
+ return category_filter_;
}
void TraceLog::SetDisabled() {
@@ -568,8 +632,7 @@ void TraceLog::SetDisabled() {
OnTraceLogWillDisable());
dispatching_to_observer_list_ = false;
- included_categories_.clear();
- excluded_categories_.clear();
+ category_filter_.Clear();
watch_category_ = NULL;
watch_event_name_ = "";
for (int i = 0; i < g_category_index; i++)
@@ -577,13 +640,6 @@ void TraceLog::SetDisabled() {
AddThreadNameMetadataEvents();
}
-void TraceLog::SetEnabled(bool enabled) {
- if (enabled)
- SetEnabled(std::vector<std::string>(), std::vector<std::string>());
- else
- SetDisabled();
-}
-
void TraceLog::AddEnabledStateObserver(EnabledStateChangedObserver* listener) {
enabled_state_observer_list_.AddObserver(listener);
}
« no previous file with comments | « base/debug/trace_event_impl.h ('k') | base/debug/trace_event_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698