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

Unified Diff: base/trace_event/trace_config.cc

Issue 1923533004: Tracing pre-filtering (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 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
Index: base/trace_event/trace_config.cc
diff --git a/base/trace_event/trace_config.cc b/base/trace_event/trace_config.cc
index e9e5a099893377e844be716845b0bbcfe90a2639..a8ba8496ce666765b5965c8c8a0c6d2465dc454f 100644
--- a/base/trace_event/trace_config.cc
+++ b/base/trace_event/trace_config.cc
@@ -51,6 +51,11 @@ const char kTriggersParam[] = "triggers";
const char kPeriodicIntervalParam[] = "periodic_interval_ms";
const char kModeParam[] = "mode";
+// String parameters used to parse category event filters.
+const char kCategoryEventFilterParam[] = "category_event_filters";
+const char kPredicateParam[] = "predicate";
+const char kArgsParam[] = "args";
+
// Default configuration of memory dumps.
const TraceConfig::MemoryDumpTriggerConfig kDefaultHeavyMemoryDumpTrigger = {
2000, // periodic_interval_ms
@@ -75,6 +80,58 @@ class ConvertableTraceConfigToTraceFormat
} // namespace
+TraceConfig::CategoryEventFilterConfig::CategoryEventFilterConfig() {}
+TraceConfig::CategoryEventFilterConfig::~CategoryEventFilterConfig() {}
+
+TraceConfig::CategoryEventFilterConfig::CategoryEventFilterConfig(
+ const CategoryEventFilterConfig& tc)
+ : predicate_name(tc.predicate_name),
+ included_categories(tc.included_categories),
+ excluded_categories(tc.excluded_categories) {
+ if (tc.args)
+ args = tc.args->CreateDeepCopy();
+}
+
+TraceConfig::CategoryEventFilterConfig& TraceConfig::CategoryEventFilterConfig::
+operator=(const TraceConfig::CategoryEventFilterConfig& rhs) {
+ if (this == &rhs)
+ return *this;
+
+ predicate_name = rhs.predicate_name;
+ included_categories = rhs.included_categories;
+ excluded_categories = rhs.excluded_categories;
+ if (rhs.args)
+ args = rhs.args->CreateDeepCopy();
+
+ return *this;
+}
+
+bool TraceConfig::CategoryEventFilterConfig::IsCategoryGroupEnabled(
+ const char* category_group_name) const {
+ CStringTokenizer category_group_tokens(
+ category_group_name, category_group_name + strlen(category_group_name),
+ ",");
+ while (category_group_tokens.GetNext()) {
+ std::string category_group_token = category_group_tokens.token();
+
+ for (const auto& excluded_category : excluded_categories) {
+ if (base::MatchPattern(category_group_token.c_str(),
+ excluded_category.c_str())) {
+ return false;
+ }
+ }
+
+ for (const auto& included_category : included_categories) {
+ if (base::MatchPattern(category_group_token.c_str(),
+ included_category.c_str())) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
TraceConfig::TraceConfig() {
InitializeDefault();
}
@@ -126,7 +183,8 @@ TraceConfig::TraceConfig(const TraceConfig& tc)
included_categories_(tc.included_categories_),
disabled_categories_(tc.disabled_categories_),
excluded_categories_(tc.excluded_categories_),
- synthetic_delays_(tc.synthetic_delays_) {}
+ synthetic_delays_(tc.synthetic_delays_),
+ category_event_filters_(tc.category_event_filters_) {}
TraceConfig::~TraceConfig() {
}
@@ -144,6 +202,7 @@ TraceConfig& TraceConfig::operator=(const TraceConfig& rhs) {
disabled_categories_ = rhs.disabled_categories_;
excluded_categories_ = rhs.excluded_categories_;
synthetic_delays_ = rhs.synthetic_delays_;
+ category_event_filters_ = rhs.category_event_filters_;
return *this;
}
@@ -151,6 +210,11 @@ const TraceConfig::StringList& TraceConfig::GetSyntheticDelayValues() const {
return synthetic_delays_;
}
+const TraceConfig::CategoryEventFilters& TraceConfig::GetCategoryEventFilters()
+ const {
+ return category_event_filters_;
+}
+
std::string TraceConfig::ToString() const {
base::DictionaryValue dict;
ToDict(dict);
@@ -343,6 +407,10 @@ void TraceConfig::InitializeFromConfigDict(const DictionaryValue& dict) {
else
SetDefaultMemoryDumpConfig();
}
+
+ const base::ListValue* category_event_filters = nullptr;
+ if (dict.GetList(kCategoryEventFilterParam, &category_event_filters))
+ SetCategoryEventFilters(*category_event_filters);
}
void TraceConfig::InitializeFromConfigString(const std::string& config_string) {
@@ -524,6 +592,51 @@ void TraceConfig::SetDefaultMemoryDumpConfig() {
memory_dump_config_.push_back(kDefaultLightMemoryDumpTrigger);
}
+void TraceConfig::SetCategoryEventFilters(
+ const base::ListValue& category_event_filters) {
+ category_event_filters_.clear();
+
+ for (size_t i = 0; i < category_event_filters.GetSize(); ++i) {
+ const base::DictionaryValue* event_filter = nullptr;
+ if (!category_event_filters.GetDictionary(i, &event_filter))
+ continue;
+
+ CategoryEventFilterConfig new_config;
+ if (!event_filter->GetString(kPredicateParam, &new_config.predicate_name)) {
+ LOG(ERROR) << "Invalid predicate name in category event filter.";
+ continue;
+ }
+
+ const base::ListValue* included_list = nullptr;
+ if (!event_filter->GetList(kIncludedCategoriesParam, &included_list)) {
+ LOG(ERROR) << "Missing included_categories in category event filter.";
+ continue;
+ }
+
+ for (size_t i = 0; i < included_list->GetSize(); ++i) {
+ std::string category;
+ if (included_list->GetString(i, &category))
+ new_config.included_categories.push_back(category);
+ }
+
+ const base::ListValue* excluded_list = nullptr;
+ if (event_filter->GetList(kExcludedCategoriesParam, &excluded_list)) {
+ for (size_t i = 0; i < excluded_list->GetSize(); ++i) {
+ std::string category;
+ if (excluded_list->GetString(i, &category))
+ new_config.excluded_categories.push_back(category);
+ }
+ }
+
+ const base::DictionaryValue* args_dict = nullptr;
+ if (event_filter->GetDictionary(kArgsParam, &args_dict)) {
+ new_config.args = args_dict->CreateDeepCopy();
+ }
+
+ category_event_filters_.push_back(new_config);
+ }
+}
+
void TraceConfig::ToDict(base::DictionaryValue& dict) const {
switch (record_mode_) {
case RECORD_UNTIL_FULL:

Powered by Google App Engine
This is Rietveld 408576698