summaryrefslogtreecommitdiffstats
path: root/chromium/base/trace_event/trace_config.cc
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2017-01-04 14:17:57 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2017-01-05 10:05:06 +0000
commit39d357e3248f80abea0159765ff39554affb40db (patch)
treeaba0e6bfb76de0244bba0f5fdbd64b830dd6e621 /chromium/base/trace_event/trace_config.cc
parent87778abf5a1f89266f37d1321b92a21851d8244d (diff)
BASELINE: Update Chromium to 55.0.2883.105
And updates ninja to 1.7.2 Change-Id: I20d43c737f82764d857ada9a55586901b18b9243 Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/base/trace_event/trace_config.cc')
-rw-r--r--chromium/base/trace_event/trace_config.cc464
1 files changed, 286 insertions, 178 deletions
diff --git a/chromium/base/trace_event/trace_config.cc b/chromium/base/trace_event/trace_config.cc
index d4dc2cc2e4e..96c4dc70646 100644
--- a/chromium/base/trace_event/trace_config.cc
+++ b/chromium/base/trace_event/trace_config.cc
@@ -14,6 +14,7 @@
#include "base/strings/pattern.h"
#include "base/strings/string_split.h"
#include "base/strings/string_tokenizer.h"
+#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/trace_event/memory_dump_manager.h"
#include "base/trace_event/memory_dump_request_args.h"
@@ -54,6 +55,11 @@ const char kModeParam[] = "mode";
const char kHeapProfilerOptions[] = "heap_profiler_options";
const char kBreakdownThresholdBytes[] = "breakdown_threshold_bytes";
+// String parameters used to parse category event filters.
+const char kEventFiltersParam[] = "event_filters";
+const char kFilterPredicateParam[] = "filter_predicate";
+const char kFilterArgsParam[] = "filter_args";
+
// Default configuration of memory dumps.
const TraceConfig::MemoryDumpConfig::Trigger kDefaultHeavyMemoryDumpTrigger = {
2000, // periodic_interval_ms
@@ -67,7 +73,9 @@ class ConvertableTraceConfigToTraceFormat
public:
explicit ConvertableTraceConfigToTraceFormat(const TraceConfig& trace_config)
: trace_config_(trace_config) {}
+
~ConvertableTraceConfigToTraceFormat() override {}
+
void AppendAsTraceFormat(std::string* out) const override {
out->append(trace_config_.ToString());
}
@@ -87,9 +95,8 @@ std::set<MemoryDumpLevelOfDetail> GetDefaultAllowedMemoryDumpModes() {
} // namespace
-
-TraceConfig::MemoryDumpConfig::HeapProfiler::HeapProfiler() :
- breakdown_threshold_bytes(kDefaultBreakdownThresholdBytes) {};
+TraceConfig::MemoryDumpConfig::HeapProfiler::HeapProfiler()
+ : breakdown_threshold_bytes(kDefaultBreakdownThresholdBytes) {}
void TraceConfig::MemoryDumpConfig::HeapProfiler::Clear() {
breakdown_threshold_bytes = kDefaultBreakdownThresholdBytes;
@@ -101,12 +108,12 @@ void TraceConfig::ResetMemoryDumpConfig(
memory_dump_config_ = memory_dump_config;
}
-TraceConfig::MemoryDumpConfig::MemoryDumpConfig() {};
+TraceConfig::MemoryDumpConfig::MemoryDumpConfig() {}
TraceConfig::MemoryDumpConfig::MemoryDumpConfig(
const MemoryDumpConfig& other) = default;
-TraceConfig::MemoryDumpConfig::~MemoryDumpConfig() {};
+TraceConfig::MemoryDumpConfig::~MemoryDumpConfig() {}
void TraceConfig::MemoryDumpConfig::Clear() {
allowed_dump_modes.clear();
@@ -114,16 +121,79 @@ void TraceConfig::MemoryDumpConfig::Clear() {
heap_profiler_options.Clear();
}
+TraceConfig::EventFilterConfig::EventFilterConfig(
+ const std::string& predicate_name)
+ : predicate_name_(predicate_name) {}
+
+TraceConfig::EventFilterConfig::~EventFilterConfig() {}
+
+TraceConfig::EventFilterConfig::EventFilterConfig(const EventFilterConfig& tc) {
+ *this = tc;
+}
+
+TraceConfig::EventFilterConfig& TraceConfig::EventFilterConfig::operator=(
+ const TraceConfig::EventFilterConfig& 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;
+}
+
+void TraceConfig::EventFilterConfig::AddIncludedCategory(
+ const std::string& category) {
+ included_categories_.push_back(category);
+}
+
+void TraceConfig::EventFilterConfig::AddExcludedCategory(
+ const std::string& category) {
+ excluded_categories_.push_back(category);
+}
+
+void TraceConfig::EventFilterConfig::SetArgs(
+ std::unique_ptr<base::DictionaryValue> args) {
+ args_ = std::move(args);
+}
+
+bool TraceConfig::EventFilterConfig::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, excluded_category)) {
+ return false;
+ }
+ }
+
+ for (const auto& included_category : included_categories_) {
+ if (base::MatchPattern(category_group_token, included_category)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
TraceConfig::TraceConfig() {
InitializeDefault();
}
-TraceConfig::TraceConfig(const std::string& category_filter_string,
- const std::string& trace_options_string) {
+TraceConfig::TraceConfig(StringPiece category_filter_string,
+ StringPiece trace_options_string) {
InitializeFromStrings(category_filter_string, trace_options_string);
}
-TraceConfig::TraceConfig(const std::string& category_filter_string,
+TraceConfig::TraceConfig(StringPiece category_filter_string,
TraceRecordMode record_mode) {
std::string trace_options_string;
switch (record_mode) {
@@ -149,7 +219,7 @@ TraceConfig::TraceConfig(const DictionaryValue& config) {
InitializeFromConfigDict(config);
}
-TraceConfig::TraceConfig(const std::string& config_string) {
+TraceConfig::TraceConfig(StringPiece config_string) {
if (!config_string.empty())
InitializeFromConfigString(config_string);
else
@@ -165,7 +235,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_),
+ event_filters_(tc.event_filters_) {}
TraceConfig::~TraceConfig() {
}
@@ -183,6 +254,7 @@ TraceConfig& TraceConfig::operator=(const TraceConfig& rhs) {
disabled_categories_ = rhs.disabled_categories_;
excluded_categories_ = rhs.excluded_categories_;
synthetic_delays_ = rhs.synthetic_delays_;
+ event_filters_ = rhs.event_filters_;
return *this;
}
@@ -191,18 +263,15 @@ const TraceConfig::StringList& TraceConfig::GetSyntheticDelayValues() const {
}
std::string TraceConfig::ToString() const {
- base::DictionaryValue dict;
- ToDict(dict);
-
+ std::unique_ptr<DictionaryValue> dict = ToDict();
std::string json;
- base::JSONWriter::Write(dict, &json);
-
+ JSONWriter::Write(*dict, &json);
return json;
}
std::unique_ptr<ConvertableToTraceFormat>
TraceConfig::AsConvertableToTraceFormat() const {
- return WrapUnique(new ConvertableTraceConfigToTraceFormat(*this));
+ return MakeUnique<ConvertableTraceConfigToTraceFormat>(*this);
}
std::string TraceConfig::ToCategoryFilterString() const {
@@ -221,20 +290,18 @@ bool TraceConfig::IsCategoryGroupEnabled(
bool had_enabled_by_default = false;
DCHECK(category_group_name);
- CStringTokenizer category_group_tokens(
- category_group_name, category_group_name + strlen(category_group_name),
- ",");
+ std::string category_group_name_str = category_group_name;
+ StringTokenizer category_group_tokens(category_group_name_str, ",");
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(!TraceConfig::IsEmptyOrContainsLeadingOrTrailingWhitespace(
category_group_token))
<< "Disallowed category string";
- if (IsCategoryEnabled(category_group_token.c_str())) {
+ if (IsCategoryEnabled(category_group_token.c_str()))
return true;
- }
- if (!base::MatchPattern(category_group_token.c_str(),
- TRACE_DISABLED_BY_DEFAULT("*")))
+
+ if (!MatchPattern(category_group_token, TRACE_DISABLED_BY_DEFAULT("*")))
had_enabled_by_default = true;
}
// Do a second pass to check for explicitly disabled categories
@@ -243,10 +310,8 @@ bool TraceConfig::IsCategoryGroupEnabled(
bool category_group_disabled = false;
while (category_group_tokens.GetNext()) {
std::string category_group_token = category_group_tokens.token();
- for (StringList::const_iterator ci = excluded_categories_.begin();
- ci != excluded_categories_.end();
- ++ci) {
- if (base::MatchPattern(category_group_token.c_str(), ci->c_str())) {
+ for (const std::string& category : excluded_categories_) {
+ if (MatchPattern(category_group_token, category)) {
// Current token of category_group_name is present in excluded_list.
// Flag the exclusion and proceed further to check if any of the
// remaining categories of category_group_name is not present in the
@@ -258,8 +323,7 @@ bool TraceConfig::IsCategoryGroupEnabled(
// excluded_ list. So, if it's not a disabled-by-default category,
// it has to be included_ list. Enable the category_group_name
// for recording.
- if (!base::MatchPattern(category_group_token.c_str(),
- TRACE_DISABLED_BY_DEFAULT("*"))) {
+ if (!MatchPattern(category_group_token, TRACE_DISABLED_BY_DEFAULT("*"))) {
category_group_disabled = false;
}
}
@@ -272,8 +336,8 @@ bool TraceConfig::IsCategoryGroupEnabled(
// If the category group is not excluded, and there are no included patterns
// we consider this category group enabled, as long as it had categories
// other than disabled-by-default.
- return !category_group_disabled &&
- included_categories_.empty() && had_enabled_by_default;
+ return !category_group_disabled && had_enabled_by_default &&
+ included_categories_.empty();
}
void TraceConfig::Merge(const TraceConfig& config) {
@@ -321,6 +385,7 @@ void TraceConfig::Clear() {
excluded_categories_.clear();
synthetic_delays_.clear();
memory_dump_config_.Clear();
+ event_filters_.clear();
}
void TraceConfig::InitializeDefault() {
@@ -345,25 +410,13 @@ void TraceConfig::InitializeFromConfigDict(const DictionaryValue& dict) {
}
}
- bool enable_sampling;
- if (!dict.GetBoolean(kEnableSamplingParam, &enable_sampling))
- enable_sampling_ = false;
- else
- enable_sampling_ = enable_sampling;
-
- bool enable_systrace;
- if (!dict.GetBoolean(kEnableSystraceParam, &enable_systrace))
- enable_systrace_ = false;
- else
- enable_systrace_ = enable_systrace;
+ bool val;
+ enable_sampling_ = dict.GetBoolean(kEnableSamplingParam, &val) ? val : false;
+ enable_systrace_ = dict.GetBoolean(kEnableSystraceParam, &val) ? val : false;
+ enable_argument_filter_ =
+ dict.GetBoolean(kEnableArgumentFilterParam, &val) ? val : false;
- bool enable_argument_filter;
- if (!dict.GetBoolean(kEnableArgumentFilterParam, &enable_argument_filter))
- enable_argument_filter_ = false;
- else
- enable_argument_filter_ = enable_argument_filter;
-
- const base::ListValue* category_list = nullptr;
+ const ListValue* category_list = nullptr;
if (dict.GetList(kIncludedCategoriesParam, &category_list))
SetCategoriesFromIncludedList(*category_list);
if (dict.GetList(kExcludedCategoriesParam, &category_list))
@@ -374,58 +427,51 @@ void TraceConfig::InitializeFromConfigDict(const DictionaryValue& dict) {
if (IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) {
// If dump triggers not set, the client is using the legacy with just
// category enabled. So, use the default periodic dump config.
- const base::DictionaryValue* memory_dump_config = nullptr;
+ const DictionaryValue* memory_dump_config = nullptr;
if (dict.GetDictionary(kMemoryDumpConfigParam, &memory_dump_config))
SetMemoryDumpConfigFromConfigDict(*memory_dump_config);
else
SetDefaultMemoryDumpConfig();
}
-}
-void TraceConfig::InitializeFromConfigString(const std::string& config_string) {
- std::unique_ptr<Value> value(JSONReader::Read(config_string));
- if (!value)
- return InitializeDefault();
-
- const DictionaryValue* dict = nullptr;
- bool is_dict = value->GetAsDictionary(&dict);
-
- if (!is_dict)
- return InitializeDefault();
+ const base::ListValue* category_event_filters = nullptr;
+ if (dict.GetList(kEventFiltersParam, &category_event_filters))
+ SetEventFilters(*category_event_filters);
+}
- DCHECK(dict);
- InitializeFromConfigDict(*dict);
+void TraceConfig::InitializeFromConfigString(StringPiece config_string) {
+ auto dict = DictionaryValue::From(JSONReader::Read(config_string));
+ if (dict)
+ InitializeFromConfigDict(*dict);
+ else
+ InitializeDefault();
}
-void TraceConfig::InitializeFromStrings(
- const std::string& category_filter_string,
- const std::string& trace_options_string) {
+void TraceConfig::InitializeFromStrings(StringPiece category_filter_string,
+ StringPiece trace_options_string) {
if (!category_filter_string.empty()) {
- std::vector<std::string> split = base::SplitString(
- category_filter_string, ",", base::TRIM_WHITESPACE,
- base::SPLIT_WANT_ALL);
- std::vector<std::string>::iterator iter;
- for (iter = split.begin(); iter != split.end(); ++iter) {
- std::string category = *iter;
+ std::vector<std::string> split = SplitString(
+ category_filter_string, ",", TRIM_WHITESPACE, SPLIT_WANT_ALL);
+ for (const std::string& category : split) {
// Ignore empty categories.
if (category.empty())
continue;
// Synthetic delays are of the form 'DELAY(delay;option;option;...)'.
- if (category.find(kSyntheticDelayCategoryFilterPrefix) == 0 &&
- category.at(category.size() - 1) == ')') {
- category = category.substr(
+ if (StartsWith(category, kSyntheticDelayCategoryFilterPrefix,
+ CompareCase::SENSITIVE) &&
+ category.back() == ')') {
+ std::string synthetic_category = category.substr(
strlen(kSyntheticDelayCategoryFilterPrefix),
category.size() - strlen(kSyntheticDelayCategoryFilterPrefix) - 1);
- size_t name_length = category.find(';');
+ size_t name_length = synthetic_category.find(';');
if (name_length != std::string::npos && name_length > 0 &&
- name_length != category.size() - 1) {
- synthetic_delays_.push_back(category);
+ name_length != synthetic_category.size() - 1) {
+ synthetic_delays_.push_back(synthetic_category);
}
- } else if (category.at(0) == '-') {
+ } else if (category.front() == '-') {
// Excluded categories start with '-'.
// Remove '-' from category string.
- category = category.substr(1);
- excluded_categories_.push_back(category);
+ excluded_categories_.push_back(category.substr(1));
} else if (category.compare(0, strlen(TRACE_DISABLED_BY_DEFAULT("")),
TRACE_DISABLED_BY_DEFAULT("")) == 0) {
disabled_categories_.push_back(category);
@@ -439,24 +485,23 @@ void TraceConfig::InitializeFromStrings(
enable_sampling_ = false;
enable_systrace_ = false;
enable_argument_filter_ = false;
- if(!trace_options_string.empty()) {
- std::vector<std::string> split = base::SplitString(
- trace_options_string, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
- std::vector<std::string>::iterator iter;
- for (iter = split.begin(); iter != split.end(); ++iter) {
- if (*iter == kRecordUntilFull) {
+ if (!trace_options_string.empty()) {
+ std::vector<std::string> split =
+ SplitString(trace_options_string, ",", TRIM_WHITESPACE, SPLIT_WANT_ALL);
+ for (const std::string& token : split) {
+ if (token == kRecordUntilFull) {
record_mode_ = RECORD_UNTIL_FULL;
- } else if (*iter == kRecordContinuously) {
+ } else if (token == kRecordContinuously) {
record_mode_ = RECORD_CONTINUOUSLY;
- } else if (*iter == kTraceToConsole) {
+ } else if (token == kTraceToConsole) {
record_mode_ = ECHO_TO_CONSOLE;
- } else if (*iter == kRecordAsMuchAsPossible) {
+ } else if (token == kRecordAsMuchAsPossible) {
record_mode_ = RECORD_AS_MUCH_AS_POSSIBLE;
- } else if (*iter == kEnableSampling) {
+ } else if (token == kEnableSampling) {
enable_sampling_ = true;
- } else if (*iter == kEnableSystrace) {
+ } else if (token == kEnableSystrace) {
enable_systrace_ = true;
- } else if (*iter == kEnableArgumentFilter) {
+ } else if (token == kEnableArgumentFilter) {
enable_argument_filter_ = true;
}
}
@@ -468,7 +513,7 @@ void TraceConfig::InitializeFromStrings(
}
void TraceConfig::SetCategoriesFromIncludedList(
- const base::ListValue& included_list) {
+ const ListValue& included_list) {
included_categories_.clear();
for (size_t i = 0; i < included_list.GetSize(); ++i) {
std::string category;
@@ -484,7 +529,7 @@ void TraceConfig::SetCategoriesFromIncludedList(
}
void TraceConfig::SetCategoriesFromExcludedList(
- const base::ListValue& excluded_list) {
+ const ListValue& excluded_list) {
excluded_categories_.clear();
for (size_t i = 0; i < excluded_list.GetSize(); ++i) {
std::string category;
@@ -493,7 +538,7 @@ void TraceConfig::SetCategoriesFromExcludedList(
}
}
-void TraceConfig::SetSyntheticDelaysFromList(const base::ListValue& list) {
+void TraceConfig::SetSyntheticDelaysFromList(const ListValue& list) {
synthetic_delays_.clear();
for (size_t i = 0; i < list.GetSize(); ++i) {
std::string delay;
@@ -508,27 +553,23 @@ void TraceConfig::SetSyntheticDelaysFromList(const base::ListValue& list) {
}
}
-void TraceConfig::AddCategoryToDict(base::DictionaryValue& dict,
+void TraceConfig::AddCategoryToDict(DictionaryValue* dict,
const char* param,
const StringList& categories) const {
if (categories.empty())
return;
- std::unique_ptr<base::ListValue> list(new base::ListValue());
- for (StringList::const_iterator ci = categories.begin();
- ci != categories.end();
- ++ci) {
- list->AppendString(*ci);
- }
-
- dict.Set(param, std::move(list));
+ auto list = MakeUnique<ListValue>();
+ for (const std::string& category : categories)
+ list->AppendString(category);
+ dict->Set(param, std::move(list));
}
void TraceConfig::SetMemoryDumpConfigFromConfigDict(
- const base::DictionaryValue& memory_dump_config) {
+ const DictionaryValue& memory_dump_config) {
// Set allowed dump modes.
memory_dump_config_.allowed_dump_modes.clear();
- const base::ListValue* allowed_modes_list;
+ const ListValue* allowed_modes_list;
if (memory_dump_config.GetList(kAllowedDumpModesParam, &allowed_modes_list)) {
for (size_t i = 0; i < allowed_modes_list->GetSize(); ++i) {
std::string level_of_detail_str;
@@ -543,21 +584,20 @@ void TraceConfig::SetMemoryDumpConfigFromConfigDict(
// Set triggers
memory_dump_config_.triggers.clear();
- const base::ListValue* trigger_list = nullptr;
+ const ListValue* trigger_list = nullptr;
if (memory_dump_config.GetList(kTriggersParam, &trigger_list) &&
trigger_list->GetSize() > 0) {
for (size_t i = 0; i < trigger_list->GetSize(); ++i) {
- const base::DictionaryValue* trigger = nullptr;
+ const DictionaryValue* trigger = nullptr;
if (!trigger_list->GetDictionary(i, &trigger))
continue;
- MemoryDumpConfig::Trigger dump_config;
int interval = 0;
-
- if (!trigger->GetInteger(kPeriodicIntervalParam, &interval)) {
+ if (!trigger->GetInteger(kPeriodicIntervalParam, &interval))
continue;
- }
+
DCHECK_GT(interval, 0);
+ MemoryDumpConfig::Trigger dump_config;
dump_config.periodic_interval_ms = static_cast<uint32_t>(interval);
std::string level_of_detail_str;
trigger->GetString(kModeParam, &level_of_detail_str);
@@ -568,7 +608,7 @@ void TraceConfig::SetMemoryDumpConfigFromConfigDict(
}
// Set heap profiler options
- const base::DictionaryValue* heap_profiler_options = nullptr;
+ const DictionaryValue* heap_profiler_options = nullptr;
if (memory_dump_config.GetDictionary(kHeapProfilerOptions,
&heap_profiler_options)) {
int min_size_bytes = 0;
@@ -589,66 +629,145 @@ void TraceConfig::SetDefaultMemoryDumpConfig() {
memory_dump_config_.triggers.push_back(kDefaultHeavyMemoryDumpTrigger);
memory_dump_config_.triggers.push_back(kDefaultLightMemoryDumpTrigger);
memory_dump_config_.allowed_dump_modes = GetDefaultAllowedMemoryDumpModes();
+
+ if (AllocationContextTracker::capture_mode() ==
+ AllocationContextTracker::CaptureMode::PSEUDO_STACK) {
+ for (const auto& filter : event_filters_) {
+ if (filter.predicate_name() ==
+ TraceLog::TraceEventFilter::kHeapProfilerPredicate)
+ return;
+ }
+ // Adds a filter predicate to filter all categories for the heap profiler.
+ // Note that the heap profiler predicate does not filter-out any events.
+ EventFilterConfig heap_profiler_config(
+ TraceLog::TraceEventFilter::kHeapProfilerPredicate);
+ heap_profiler_config.AddIncludedCategory("*");
+ heap_profiler_config.AddIncludedCategory(MemoryDumpManager::kTraceCategory);
+ event_filters_.push_back(heap_profiler_config);
+ }
+}
+
+void TraceConfig::SetEventFilters(
+ const base::ListValue& category_event_filters) {
+ event_filters_.clear();
+
+ for (size_t event_filter_index = 0;
+ event_filter_index < category_event_filters.GetSize();
+ ++event_filter_index) {
+ const base::DictionaryValue* event_filter = nullptr;
+ if (!category_event_filters.GetDictionary(event_filter_index,
+ &event_filter))
+ continue;
+
+ std::string predicate_name;
+ CHECK(event_filter->GetString(kFilterPredicateParam, &predicate_name))
+ << "Invalid predicate name in category event filter.";
+
+ EventFilterConfig new_config(predicate_name);
+ const base::ListValue* included_list = nullptr;
+ CHECK(event_filter->GetList(kIncludedCategoriesParam, &included_list))
+ << "Missing included_categories in category event filter.";
+
+ for (size_t i = 0; i < included_list->GetSize(); ++i) {
+ std::string category;
+ if (included_list->GetString(i, &category))
+ new_config.AddIncludedCategory(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.AddExcludedCategory(category);
+ }
+ }
+
+ const base::DictionaryValue* args_dict = nullptr;
+ if (event_filter->GetDictionary(kFilterArgsParam, &args_dict))
+ new_config.SetArgs(args_dict->CreateDeepCopy());
+
+ event_filters_.push_back(new_config);
+ }
}
-void TraceConfig::ToDict(base::DictionaryValue& dict) const {
+std::unique_ptr<DictionaryValue> TraceConfig::ToDict() const {
+ auto dict = MakeUnique<DictionaryValue>();
switch (record_mode_) {
case RECORD_UNTIL_FULL:
- dict.SetString(kRecordModeParam, kRecordUntilFull);
+ dict->SetString(kRecordModeParam, kRecordUntilFull);
break;
case RECORD_CONTINUOUSLY:
- dict.SetString(kRecordModeParam, kRecordContinuously);
+ dict->SetString(kRecordModeParam, kRecordContinuously);
break;
case RECORD_AS_MUCH_AS_POSSIBLE:
- dict.SetString(kRecordModeParam, kRecordAsMuchAsPossible);
+ dict->SetString(kRecordModeParam, kRecordAsMuchAsPossible);
break;
case ECHO_TO_CONSOLE:
- dict.SetString(kRecordModeParam, kTraceToConsole);
+ dict->SetString(kRecordModeParam, kTraceToConsole);
break;
default:
NOTREACHED();
}
- if (enable_sampling_)
- dict.SetBoolean(kEnableSamplingParam, true);
- else
- dict.SetBoolean(kEnableSamplingParam, false);
-
- if (enable_systrace_)
- dict.SetBoolean(kEnableSystraceParam, true);
- else
- dict.SetBoolean(kEnableSystraceParam, false);
-
- if (enable_argument_filter_)
- dict.SetBoolean(kEnableArgumentFilterParam, true);
- else
- dict.SetBoolean(kEnableArgumentFilterParam, false);
+ dict->SetBoolean(kEnableSamplingParam, enable_sampling_);
+ dict->SetBoolean(kEnableSystraceParam, enable_systrace_);
+ dict->SetBoolean(kEnableArgumentFilterParam, enable_argument_filter_);
StringList categories(included_categories_);
categories.insert(categories.end(),
disabled_categories_.begin(),
disabled_categories_.end());
- AddCategoryToDict(dict, kIncludedCategoriesParam, categories);
- AddCategoryToDict(dict, kExcludedCategoriesParam, excluded_categories_);
- AddCategoryToDict(dict, kSyntheticDelaysParam, synthetic_delays_);
+ AddCategoryToDict(dict.get(), kIncludedCategoriesParam, categories);
+ AddCategoryToDict(dict.get(), kExcludedCategoriesParam, excluded_categories_);
+ AddCategoryToDict(dict.get(), kSyntheticDelaysParam, synthetic_delays_);
+
+ if (!event_filters_.empty()) {
+ std::unique_ptr<base::ListValue> filter_list(new base::ListValue());
+ for (const EventFilterConfig& filter : event_filters_) {
+ std::unique_ptr<base::DictionaryValue> filter_dict(
+ new base::DictionaryValue());
+ filter_dict->SetString(kFilterPredicateParam, filter.predicate_name());
- if (IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) {
- std::unique_ptr<base::DictionaryValue> memory_dump_config(
- new base::DictionaryValue());
- std::unique_ptr<base::ListValue> allowed_modes_list(new base::ListValue());
- for (MemoryDumpLevelOfDetail dump_mode :
- memory_dump_config_.allowed_dump_modes) {
- allowed_modes_list->AppendString(
- MemoryDumpLevelOfDetailToString(dump_mode));
+ std::unique_ptr<base::ListValue> included_categories_list(
+ new base::ListValue());
+ for (const std::string& included_category : filter.included_categories())
+ included_categories_list->AppendString(included_category);
+
+ filter_dict->Set(kIncludedCategoriesParam,
+ std::move(included_categories_list));
+
+ if (!filter.excluded_categories().empty()) {
+ std::unique_ptr<base::ListValue> excluded_categories_list(
+ new base::ListValue());
+ for (const std::string& excluded_category :
+ filter.excluded_categories())
+ excluded_categories_list->AppendString(excluded_category);
+
+ filter_dict->Set(kExcludedCategoriesParam,
+ std::move(excluded_categories_list));
+ }
+
+ if (filter.filter_args())
+ filter_dict->Set(kFilterArgsParam,
+ filter.filter_args()->CreateDeepCopy());
+
+ filter_list->Append(std::move(filter_dict));
}
- memory_dump_config->Set(kAllowedDumpModesParam,
- std::move(allowed_modes_list));
+ dict->Set(kEventFiltersParam, std::move(filter_list));
+ }
- std::unique_ptr<base::ListValue> triggers_list(new base::ListValue());
- for (const MemoryDumpConfig::Trigger& config
- : memory_dump_config_.triggers) {
- std::unique_ptr<base::DictionaryValue> trigger_dict(
- new base::DictionaryValue());
+ if (IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) {
+ auto allowed_modes = MakeUnique<ListValue>();
+ for (auto dump_mode : memory_dump_config_.allowed_dump_modes)
+ allowed_modes->AppendString(MemoryDumpLevelOfDetailToString(dump_mode));
+
+ auto memory_dump_config = MakeUnique<DictionaryValue>();
+ memory_dump_config->Set(kAllowedDumpModesParam, std::move(allowed_modes));
+
+ auto triggers_list = MakeUnique<ListValue>();
+ for (const auto& config : memory_dump_config_.triggers) {
+ auto trigger_dict = MakeUnique<DictionaryValue>();
trigger_dict->SetInteger(kPeriodicIntervalParam,
static_cast<int>(config.periodic_interval_ms));
trigger_dict->SetString(
@@ -662,16 +781,15 @@ void TraceConfig::ToDict(base::DictionaryValue& dict) const {
if (memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes !=
MemoryDumpConfig::HeapProfiler::kDefaultBreakdownThresholdBytes) {
- std::unique_ptr<base::DictionaryValue> heap_profiler_options(
- new base::DictionaryValue());
- heap_profiler_options->SetInteger(
+ auto options = MakeUnique<DictionaryValue>();
+ options->SetInteger(
kBreakdownThresholdBytes,
memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes);
- memory_dump_config->Set(kHeapProfilerOptions,
- std::move(heap_profiler_options));
+ memory_dump_config->Set(kHeapProfilerOptions, std::move(options));
}
- dict.Set(kMemoryDumpConfigParam, std::move(memory_dump_config));
+ dict->Set(kMemoryDumpConfigParam, std::move(memory_dump_config));
}
+ return dict;
}
std::string TraceConfig::ToTraceOptionsString() const {
@@ -706,11 +824,10 @@ void TraceConfig::WriteCategoryFilterString(const StringList& values,
bool included) const {
bool prepend_comma = !out->empty();
int token_cnt = 0;
- for (StringList::const_iterator ci = values.begin();
- ci != values.end(); ++ci) {
+ for (const std::string& category : values) {
if (token_cnt > 0 || prepend_comma)
StringAppendF(out, ",");
- StringAppendF(out, "%s%s", (included ? "" : "-"), ci->c_str());
+ StringAppendF(out, "%s%s", (included ? "" : "-"), category.c_str());
++token_cnt;
}
}
@@ -719,35 +836,28 @@ void TraceConfig::WriteCategoryFilterString(const StringList& delays,
std::string* out) const {
bool prepend_comma = !out->empty();
int token_cnt = 0;
- for (StringList::const_iterator ci = delays.begin();
- ci != delays.end(); ++ci) {
+ for (const std::string& category : delays) {
if (token_cnt > 0 || prepend_comma)
StringAppendF(out, ",");
StringAppendF(out, "%s%s)", kSyntheticDelayCategoryFilterPrefix,
- ci->c_str());
+ category.c_str());
++token_cnt;
}
}
bool TraceConfig::IsCategoryEnabled(const char* category_name) const {
- StringList::const_iterator ci;
-
// Check the disabled- filters and the disabled-* wildcard first so that a
// "*" filter does not include the disabled.
- for (ci = disabled_categories_.begin();
- ci != disabled_categories_.end();
- ++ci) {
- if (base::MatchPattern(category_name, ci->c_str()))
+ for (const std::string& category : disabled_categories_) {
+ if (MatchPattern(category_name, category))
return true;
}
- if (base::MatchPattern(category_name, TRACE_DISABLED_BY_DEFAULT("*")))
+ if (MatchPattern(category_name, TRACE_DISABLED_BY_DEFAULT("*")))
return false;
- for (ci = included_categories_.begin();
- ci != included_categories_.end();
- ++ci) {
- if (base::MatchPattern(category_name, ci->c_str()))
+ for (const std::string& category : included_categories_) {
+ if (MatchPattern(category_name, category))
return true;
}
@@ -755,10 +865,8 @@ bool TraceConfig::IsCategoryEnabled(const char* category_name) const {
}
bool TraceConfig::IsEmptyOrContainsLeadingOrTrailingWhitespace(
- const std::string& str) {
- return str.empty() ||
- str.at(0) == ' ' ||
- str.at(str.length() - 1) == ' ';
+ StringPiece str) {
+ return str.empty() || str.front() == ' ' || str.back() == ' ';
}
bool TraceConfig::HasIncludedPatterns() const {