OLD | NEW |
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/trace_event/trace_config.h" | 5 #include "base/trace_event/trace_config.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 29 matching lines...) Expand all Loading... |
40 const char kEnableArgumentFilterParam[] = "enable_argument_filter"; | 40 const char kEnableArgumentFilterParam[] = "enable_argument_filter"; |
41 const char kIncludedCategoriesParam[] = "included_categories"; | 41 const char kIncludedCategoriesParam[] = "included_categories"; |
42 const char kExcludedCategoriesParam[] = "excluded_categories"; | 42 const char kExcludedCategoriesParam[] = "excluded_categories"; |
43 const char kSyntheticDelaysParam[] = "synthetic_delays"; | 43 const char kSyntheticDelaysParam[] = "synthetic_delays"; |
44 | 44 |
45 const char kSyntheticDelayCategoryFilterPrefix[] = "DELAY("; | 45 const char kSyntheticDelayCategoryFilterPrefix[] = "DELAY("; |
46 | 46 |
47 // String parameters that is used to parse memory dump config in trace config | 47 // String parameters that is used to parse memory dump config in trace config |
48 // string. | 48 // string. |
49 const char kMemoryDumpConfigParam[] = "memory_dump_config"; | 49 const char kMemoryDumpConfigParam[] = "memory_dump_config"; |
| 50 const char kAllowedDumpModesParam[] = "allowed_dump_modes"; |
50 const char kTriggersParam[] = "triggers"; | 51 const char kTriggersParam[] = "triggers"; |
51 const char kPeriodicIntervalParam[] = "periodic_interval_ms"; | 52 const char kPeriodicIntervalParam[] = "periodic_interval_ms"; |
52 const char kModeParam[] = "mode"; | 53 const char kModeParam[] = "mode"; |
53 const char kHeapProfilerOptions[] = "heap_profiler_options"; | 54 const char kHeapProfilerOptions[] = "heap_profiler_options"; |
54 const char kBreakdownThresholdBytes[] = "breakdown_threshold_bytes"; | 55 const char kBreakdownThresholdBytes[] = "breakdown_threshold_bytes"; |
55 | 56 |
56 // Default configuration of memory dumps. | 57 // Default configuration of memory dumps. |
57 const TraceConfig::MemoryDumpConfig::Trigger kDefaultHeavyMemoryDumpTrigger = { | 58 const TraceConfig::MemoryDumpConfig::Trigger kDefaultHeavyMemoryDumpTrigger = { |
58 2000, // periodic_interval_ms | 59 2000, // periodic_interval_ms |
59 MemoryDumpLevelOfDetail::DETAILED}; | 60 MemoryDumpLevelOfDetail::DETAILED}; |
60 const TraceConfig::MemoryDumpConfig::Trigger kDefaultLightMemoryDumpTrigger = { | 61 const TraceConfig::MemoryDumpConfig::Trigger kDefaultLightMemoryDumpTrigger = { |
61 250, // periodic_interval_ms | 62 250, // periodic_interval_ms |
62 MemoryDumpLevelOfDetail::LIGHT}; | 63 MemoryDumpLevelOfDetail::LIGHT}; |
63 | 64 |
64 class ConvertableTraceConfigToTraceFormat | 65 class ConvertableTraceConfigToTraceFormat |
65 : public base::trace_event::ConvertableToTraceFormat { | 66 : public base::trace_event::ConvertableToTraceFormat { |
66 public: | 67 public: |
67 explicit ConvertableTraceConfigToTraceFormat(const TraceConfig& trace_config) | 68 explicit ConvertableTraceConfigToTraceFormat(const TraceConfig& trace_config) |
68 : trace_config_(trace_config) {} | 69 : trace_config_(trace_config) {} |
69 ~ConvertableTraceConfigToTraceFormat() override {} | 70 ~ConvertableTraceConfigToTraceFormat() override {} |
70 void AppendAsTraceFormat(std::string* out) const override { | 71 void AppendAsTraceFormat(std::string* out) const override { |
71 out->append(trace_config_.ToString()); | 72 out->append(trace_config_.ToString()); |
72 } | 73 } |
73 | 74 |
74 private: | 75 private: |
75 const TraceConfig trace_config_; | 76 const TraceConfig trace_config_; |
76 }; | 77 }; |
77 | 78 |
| 79 std::set<MemoryDumpLevelOfDetail> GetDefaultAllowedMemoryDumpModes() { |
| 80 std::set<MemoryDumpLevelOfDetail> all_modes; |
| 81 for (uint32_t mode = static_cast<uint32_t>(MemoryDumpLevelOfDetail::FIRST); |
| 82 mode <= static_cast<uint32_t>(MemoryDumpLevelOfDetail::LAST); mode++) { |
| 83 all_modes.insert(static_cast<MemoryDumpLevelOfDetail>(mode)); |
| 84 } |
| 85 return all_modes; |
| 86 } |
| 87 |
78 } // namespace | 88 } // namespace |
79 | 89 |
80 | 90 |
81 TraceConfig::MemoryDumpConfig::HeapProfiler::HeapProfiler() : | 91 TraceConfig::MemoryDumpConfig::HeapProfiler::HeapProfiler() : |
82 breakdown_threshold_bytes(kDefaultBreakdownThresholdBytes) {}; | 92 breakdown_threshold_bytes(kDefaultBreakdownThresholdBytes) {}; |
83 | 93 |
84 void TraceConfig::MemoryDumpConfig::HeapProfiler::Clear() { | 94 void TraceConfig::MemoryDumpConfig::HeapProfiler::Clear() { |
85 breakdown_threshold_bytes = kDefaultBreakdownThresholdBytes; | 95 breakdown_threshold_bytes = kDefaultBreakdownThresholdBytes; |
86 } | 96 } |
87 | 97 |
88 void TraceConfig::ResetMemoryDumpConfig( | 98 void TraceConfig::ResetMemoryDumpConfig( |
89 const TraceConfig::MemoryDumpConfig& memory_dump_config) { | 99 const TraceConfig::MemoryDumpConfig& memory_dump_config) { |
90 memory_dump_config_.Clear(); | 100 memory_dump_config_.Clear(); |
91 memory_dump_config_ = memory_dump_config; | 101 memory_dump_config_ = memory_dump_config; |
92 } | 102 } |
93 | 103 |
94 TraceConfig::MemoryDumpConfig::MemoryDumpConfig() {}; | 104 TraceConfig::MemoryDumpConfig::MemoryDumpConfig() {}; |
95 | 105 |
96 TraceConfig::MemoryDumpConfig::MemoryDumpConfig( | 106 TraceConfig::MemoryDumpConfig::MemoryDumpConfig( |
97 const MemoryDumpConfig& other) = default; | 107 const MemoryDumpConfig& other) = default; |
98 | 108 |
99 TraceConfig::MemoryDumpConfig::~MemoryDumpConfig() {}; | 109 TraceConfig::MemoryDumpConfig::~MemoryDumpConfig() {}; |
100 | 110 |
101 void TraceConfig::MemoryDumpConfig::Clear() { | 111 void TraceConfig::MemoryDumpConfig::Clear() { |
| 112 allowed_dump_modes.clear(); |
102 triggers.clear(); | 113 triggers.clear(); |
103 heap_profiler_options.Clear(); | 114 heap_profiler_options.Clear(); |
104 } | 115 } |
105 | 116 |
106 TraceConfig::TraceConfig() { | 117 TraceConfig::TraceConfig() { |
107 InitializeDefault(); | 118 InitializeDefault(); |
108 } | 119 } |
109 | 120 |
110 TraceConfig::TraceConfig(const std::string& category_filter_string, | 121 TraceConfig::TraceConfig(const std::string& category_filter_string, |
111 const std::string& trace_options_string) { | 122 const std::string& trace_options_string) { |
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 ci != categories.end(); | 519 ci != categories.end(); |
509 ++ci) { | 520 ++ci) { |
510 list->AppendString(*ci); | 521 list->AppendString(*ci); |
511 } | 522 } |
512 | 523 |
513 dict.Set(param, std::move(list)); | 524 dict.Set(param, std::move(list)); |
514 } | 525 } |
515 | 526 |
516 void TraceConfig::SetMemoryDumpConfigFromConfigDict( | 527 void TraceConfig::SetMemoryDumpConfigFromConfigDict( |
517 const base::DictionaryValue& memory_dump_config) { | 528 const base::DictionaryValue& memory_dump_config) { |
| 529 // Set allowed dump modes. |
| 530 memory_dump_config_.allowed_dump_modes.clear(); |
| 531 const base::ListValue* allowed_modes_list; |
| 532 if (memory_dump_config.GetList(kAllowedDumpModesParam, &allowed_modes_list)) { |
| 533 for (size_t i = 0; i < allowed_modes_list->GetSize(); ++i) { |
| 534 std::string level_of_detail_str; |
| 535 allowed_modes_list->GetString(i, &level_of_detail_str); |
| 536 memory_dump_config_.allowed_dump_modes.insert( |
| 537 StringToMemoryDumpLevelOfDetail(level_of_detail_str)); |
| 538 } |
| 539 } else { |
| 540 // If allowed modes param is not given then allow all modes by default. |
| 541 memory_dump_config_.allowed_dump_modes = GetDefaultAllowedMemoryDumpModes(); |
| 542 } |
| 543 |
518 // Set triggers | 544 // Set triggers |
519 memory_dump_config_.triggers.clear(); | 545 memory_dump_config_.triggers.clear(); |
520 | |
521 const base::ListValue* trigger_list = nullptr; | 546 const base::ListValue* trigger_list = nullptr; |
522 if (memory_dump_config.GetList(kTriggersParam, &trigger_list) && | 547 if (memory_dump_config.GetList(kTriggersParam, &trigger_list) && |
523 trigger_list->GetSize() > 0) { | 548 trigger_list->GetSize() > 0) { |
524 for (size_t i = 0; i < trigger_list->GetSize(); ++i) { | 549 for (size_t i = 0; i < trigger_list->GetSize(); ++i) { |
525 const base::DictionaryValue* trigger = nullptr; | 550 const base::DictionaryValue* trigger = nullptr; |
526 if (!trigger_list->GetDictionary(i, &trigger)) | 551 if (!trigger_list->GetDictionary(i, &trigger)) |
527 continue; | 552 continue; |
528 | 553 |
529 MemoryDumpConfig::Trigger dump_config; | 554 MemoryDumpConfig::Trigger dump_config; |
530 int interval = 0; | 555 int interval = 0; |
(...skipping 25 matching lines...) Expand all Loading... |
556 memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes = | 581 memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes = |
557 MemoryDumpConfig::HeapProfiler::kDefaultBreakdownThresholdBytes; | 582 MemoryDumpConfig::HeapProfiler::kDefaultBreakdownThresholdBytes; |
558 } | 583 } |
559 } | 584 } |
560 } | 585 } |
561 | 586 |
562 void TraceConfig::SetDefaultMemoryDumpConfig() { | 587 void TraceConfig::SetDefaultMemoryDumpConfig() { |
563 memory_dump_config_.Clear(); | 588 memory_dump_config_.Clear(); |
564 memory_dump_config_.triggers.push_back(kDefaultHeavyMemoryDumpTrigger); | 589 memory_dump_config_.triggers.push_back(kDefaultHeavyMemoryDumpTrigger); |
565 memory_dump_config_.triggers.push_back(kDefaultLightMemoryDumpTrigger); | 590 memory_dump_config_.triggers.push_back(kDefaultLightMemoryDumpTrigger); |
| 591 memory_dump_config_.allowed_dump_modes = GetDefaultAllowedMemoryDumpModes(); |
566 } | 592 } |
567 | 593 |
568 void TraceConfig::ToDict(base::DictionaryValue& dict) const { | 594 void TraceConfig::ToDict(base::DictionaryValue& dict) const { |
569 switch (record_mode_) { | 595 switch (record_mode_) { |
570 case RECORD_UNTIL_FULL: | 596 case RECORD_UNTIL_FULL: |
571 dict.SetString(kRecordModeParam, kRecordUntilFull); | 597 dict.SetString(kRecordModeParam, kRecordUntilFull); |
572 break; | 598 break; |
573 case RECORD_CONTINUOUSLY: | 599 case RECORD_CONTINUOUSLY: |
574 dict.SetString(kRecordModeParam, kRecordContinuously); | 600 dict.SetString(kRecordModeParam, kRecordContinuously); |
575 break; | 601 break; |
(...skipping 26 matching lines...) Expand all Loading... |
602 categories.insert(categories.end(), | 628 categories.insert(categories.end(), |
603 disabled_categories_.begin(), | 629 disabled_categories_.begin(), |
604 disabled_categories_.end()); | 630 disabled_categories_.end()); |
605 AddCategoryToDict(dict, kIncludedCategoriesParam, categories); | 631 AddCategoryToDict(dict, kIncludedCategoriesParam, categories); |
606 AddCategoryToDict(dict, kExcludedCategoriesParam, excluded_categories_); | 632 AddCategoryToDict(dict, kExcludedCategoriesParam, excluded_categories_); |
607 AddCategoryToDict(dict, kSyntheticDelaysParam, synthetic_delays_); | 633 AddCategoryToDict(dict, kSyntheticDelaysParam, synthetic_delays_); |
608 | 634 |
609 if (IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) { | 635 if (IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) { |
610 std::unique_ptr<base::DictionaryValue> memory_dump_config( | 636 std::unique_ptr<base::DictionaryValue> memory_dump_config( |
611 new base::DictionaryValue()); | 637 new base::DictionaryValue()); |
| 638 std::unique_ptr<base::ListValue> allowed_modes_list(new base::ListValue()); |
| 639 for (MemoryDumpLevelOfDetail dump_mode : |
| 640 memory_dump_config_.allowed_dump_modes) { |
| 641 allowed_modes_list->AppendString( |
| 642 MemoryDumpLevelOfDetailToString(dump_mode)); |
| 643 } |
| 644 memory_dump_config->Set(kAllowedDumpModesParam, |
| 645 std::move(allowed_modes_list)); |
| 646 |
612 std::unique_ptr<base::ListValue> triggers_list(new base::ListValue()); | 647 std::unique_ptr<base::ListValue> triggers_list(new base::ListValue()); |
613 for (const MemoryDumpConfig::Trigger& config | 648 for (const MemoryDumpConfig::Trigger& config |
614 : memory_dump_config_.triggers) { | 649 : memory_dump_config_.triggers) { |
615 std::unique_ptr<base::DictionaryValue> trigger_dict( | 650 std::unique_ptr<base::DictionaryValue> trigger_dict( |
616 new base::DictionaryValue()); | 651 new base::DictionaryValue()); |
617 trigger_dict->SetInteger(kPeriodicIntervalParam, | 652 trigger_dict->SetInteger(kPeriodicIntervalParam, |
618 static_cast<int>(config.periodic_interval_ms)); | 653 static_cast<int>(config.periodic_interval_ms)); |
619 trigger_dict->SetString( | 654 trigger_dict->SetString( |
620 kModeParam, MemoryDumpLevelOfDetailToString(config.level_of_detail)); | 655 kModeParam, MemoryDumpLevelOfDetailToString(config.level_of_detail)); |
621 triggers_list->Append(std::move(trigger_dict)); | 656 triggers_list->Append(std::move(trigger_dict)); |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
725 str.at(0) == ' ' || | 760 str.at(0) == ' ' || |
726 str.at(str.length() - 1) == ' '; | 761 str.at(str.length() - 1) == ' '; |
727 } | 762 } |
728 | 763 |
729 bool TraceConfig::HasIncludedPatterns() const { | 764 bool TraceConfig::HasIncludedPatterns() const { |
730 return !included_categories_.empty(); | 765 return !included_categories_.empty(); |
731 } | 766 } |
732 | 767 |
733 } // namespace trace_event | 768 } // namespace trace_event |
734 } // namespace base | 769 } // namespace base |
OLD | NEW |