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

Unified Diff: base/trace_event/trace_config.cc

Issue 1306753005: [tracing] Add memory dump config to TraceConfig (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Nits. Created 5 years, 4 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 974e40fe4b79e8fc362b0664f91d0c1bc0b941d2..77e75d6e1181f433b14f41a72ef6b402e4beba34 100644
--- a/base/trace_event/trace_config.cc
+++ b/base/trace_event/trace_config.cc
@@ -10,6 +10,7 @@
#include "base/strings/string_split.h"
#include "base/strings/string_tokenizer.h"
#include "base/strings/stringprintf.h"
+#include "base/trace_event/memory_dump_manager.h"
#include "base/trace_event/trace_event.h"
namespace base {
@@ -37,6 +38,23 @@ const char kSyntheticDelaysParam[] = "synthetic_delays";
const char kSyntheticDelayCategoryFilterPrefix[] = "DELAY(";
+// String parameters that is used to parse memory dump config in trace config
+// string.
+const char kMemoryDumpConfigParam[] = "memory_dump_config";
+const char kTriggersParam[] = "triggers";
+const char kPeriodicIntervalParam[] = "periodic_interval_ms";
+const char kDumpTypeParam[] = "dump_type";
+const char kHeavyDumpTypeParam[] = "heavy";
+const char kLightDumpTypeParam[] = "light";
+
+// Default configuration of memory dumps.
+const TraceConfig::MemoryDumpConfig kDefaultHeavyMemoryDumpConfig = {
+ 2000, // periodic_interval_ms
+ MemoryDumpArgs::LevelOfDetail::HIGH};
+const TraceConfig::MemoryDumpConfig kDefaultLightMemoryDumpConfig = {
+ 250, // periodic_interval_ms
+ MemoryDumpArgs::LevelOfDetail::LOW};
+
} // namespace
TraceConfig::TraceConfig() {
@@ -82,11 +100,11 @@ TraceConfig::TraceConfig(const TraceConfig& tc)
enable_sampling_(tc.enable_sampling_),
enable_systrace_(tc.enable_systrace_),
enable_argument_filter_(tc.enable_argument_filter_),
+ memory_dump_config_list_(tc.memory_dump_config_list_),
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_) {}
TraceConfig::~TraceConfig() {
}
@@ -99,6 +117,7 @@ TraceConfig& TraceConfig::operator=(const TraceConfig& rhs) {
enable_sampling_ = rhs.enable_sampling_;
enable_systrace_ = rhs.enable_systrace_;
enable_argument_filter_ = rhs.enable_argument_filter_;
+ memory_dump_config_list_ = rhs.memory_dump_config_list_;
included_categories_ = rhs.included_categories_;
disabled_categories_ = rhs.disabled_categories_;
excluded_categories_ = rhs.excluded_categories_;
@@ -207,6 +226,10 @@ void TraceConfig::Merge(const TraceConfig& config) {
included_categories_.clear();
}
+ memory_dump_config_list_.insert(memory_dump_config_list_.end(),
+ config.memory_dump_config_list_.begin(),
+ config.memory_dump_config_list_.end());
+
disabled_categories_.insert(disabled_categories_.end(),
config.disabled_categories_.begin(),
config.disabled_categories_.end());
@@ -227,6 +250,7 @@ void TraceConfig::Clear() {
disabled_categories_.clear();
excluded_categories_.clear();
synthetic_delays_.clear();
+ memory_dump_config_list_.clear();
}
void TraceConfig::InitializeDefault() {
@@ -279,14 +303,21 @@ void TraceConfig::InitializeFromConfigString(const std::string& config_string) {
else
enable_argument_filter_ = enable_argument_filter;
-
- base::ListValue* category_list = NULL;
+ base::ListValue* category_list = nullptr;
if (dict->GetList(kIncludedCategoriesParam, &category_list))
SetCategoriesFromIncludedList(*category_list);
if (dict->GetList(kExcludedCategoriesParam, &category_list))
SetCategoriesFromExcludedList(*category_list);
if (dict->GetList(kSyntheticDelaysParam, &category_list))
SetSyntheticDelaysFromList(*category_list);
+
+ if (!IsCategoryEnabled(MemoryDumpManager::kTraceCategory))
+ return;
Primiano Tucci (use gerrit) 2015/08/24 11:58:35 probably in this case you might not want an early
ssid 2015/08/24 15:29:30 Done.
+
+ base::DictionaryValue* memory_dump_config = nullptr;
+ if (dict->GetDictionary(kMemoryDumpConfigParam, &memory_dump_config)) {
+ SetMemoryDumpConfigList(*memory_dump_config);
+ }
}
void TraceConfig::InitializeFromStrings(
@@ -353,6 +384,12 @@ void TraceConfig::InitializeFromStrings(
}
}
}
+
+ if (IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) {
+ memory_dump_config_list_.clear();
+ memory_dump_config_list_.push_back(kDefaultHeavyMemoryDumpConfig);
+ memory_dump_config_list_.push_back(kDefaultLightMemoryDumpConfig);
+ }
}
void TraceConfig::SetCategoriesFromIncludedList(
@@ -412,6 +449,47 @@ void TraceConfig::AddCategoryToDict(base::DictionaryValue& dict,
dict.Set(param, list.Pass());
}
+void TraceConfig::SetMemoryDumpConfigList(
+ base::DictionaryValue& memory_dump_config) {
Primiano Tucci (use gerrit) 2015/08/24 11:58:35 +const
ssid 2015/08/24 15:29:30 Done.
+ base::ListValue* trigger_list = nullptr;
+ if (!memory_dump_config.GetList(kTriggersParam, &trigger_list) ||
+ trigger_list->GetSize() == 0) {
+ // If triggers are not set, use the default config.
Primiano Tucci (use gerrit) 2015/08/24 11:58:36 Don't you want to just disable the periodic dumps
ssid 2015/08/24 15:29:30 yes, I forgot that part, changed.
+ memory_dump_config_list_.push_back(kDefaultHeavyMemoryDumpConfig);
+ memory_dump_config_list_.push_back(kDefaultLightMemoryDumpConfig);
+ return;
+ }
+
+ for (size_t i = 0; i < trigger_list->GetSize(); ++i) {
+ base::DictionaryValue* trigger = nullptr;
+ if (!trigger_list->GetDictionary(i, &trigger))
+ continue;
+
+ MemoryDumpConfig dump_config;
+ std::string dump_type;
+ int interval;
Primiano Tucci (use gerrit) 2015/08/24 11:58:35 = 0;
ssid 2015/08/24 15:29:30 Done.
+
+ if (!trigger->GetInteger(kPeriodicIntervalParam, &interval)) {
+ continue;
+ }
+ DCHECK_GT(interval, 0);
+ dump_config.periodic_interval_ms = static_cast<uint32>(interval);
+
+ if (trigger->GetString(kDumpTypeParam, &dump_type)) {
+ if (dump_type == kHeavyDumpTypeParam) {
+ dump_config.dump_level_of_detail = MemoryDumpArgs::LevelOfDetail::HIGH;
+ } else if (dump_type == kLightDumpTypeParam) {
+ dump_config.dump_level_of_detail = MemoryDumpArgs::LevelOfDetail::LOW;
+ }
+ } else {
+ // If dump type is not specified use light.
+ dump_config.dump_level_of_detail = MemoryDumpArgs::LevelOfDetail::LOW;
Primiano Tucci (use gerrit) 2015/08/24 11:58:36 I'd probably rework this by making LOW the default
ssid 2015/08/24 15:29:30 Done.
+ }
+
+ memory_dump_config_list_.push_back(dump_config);
+ }
+}
+
void TraceConfig::ToDict(base::DictionaryValue& dict) const {
switch (record_mode_) {
case RECORD_UNTIL_FULL:
@@ -452,6 +530,35 @@ void TraceConfig::ToDict(base::DictionaryValue& dict) const {
AddCategoryToDict(dict, kIncludedCategoriesParam, categories);
AddCategoryToDict(dict, kExcludedCategoriesParam, excluded_categories_);
AddCategoryToDict(dict, kSyntheticDelaysParam, synthetic_delays_);
+
+ if (!IsCategoryEnabled(MemoryDumpManager::kTraceCategory) ||
+ memory_dump_config_list_.size() == 0) {
+ return;
Primiano Tucci (use gerrit) 2015/08/24 11:58:35 same reason of above here, not sure if I'f I'd do
ssid 2015/08/24 15:29:30 Done.
+ }
+
+ scoped_ptr<base::DictionaryValue> memory_dump_config(
+ new base::DictionaryValue());
+ scoped_ptr<base::ListValue> triggers_list(new base::ListValue());
+ for (const MemoryDumpConfig& config : memory_dump_config_list_) {
+ scoped_ptr<base::DictionaryValue> trigger_dict(new base::DictionaryValue());
+ trigger_dict->SetInteger(kPeriodicIntervalParam,
+ static_cast<int>(config.periodic_interval_ms));
+
+ switch (config.dump_level_of_detail) {
+ case MemoryDumpArgs::LevelOfDetail::LOW:
+ trigger_dict->SetString(kDumpTypeParam, kLightDumpTypeParam);
+ break;
+ case MemoryDumpArgs::LevelOfDetail::HIGH:
+ trigger_dict->SetString(kDumpTypeParam, kHeavyDumpTypeParam);
+ break;
+ default:
+ NOTREACHED();
Primiano Tucci (use gerrit) 2015/08/24 11:58:35 I think that you don't need the default: case here
ssid 2015/08/24 15:29:31 Yes, but I added the default case since the other
+ }
+ triggers_list->Append(trigger_dict.Pass());
+ }
+
+ memory_dump_config->Set(kTriggersParam, triggers_list.Pass());
+ dict.Set(kMemoryDumpConfigParam, memory_dump_config.Pass());
}
std::string TraceConfig::ToTraceOptionsString() const {

Powered by Google App Engine
This is Rietveld 408576698