Chromium Code Reviews| Index: base/trace_event/memory_dump_manager.cc |
| diff --git a/base/trace_event/memory_dump_manager.cc b/base/trace_event/memory_dump_manager.cc |
| index a813d85a11a21d70c61b3c720d6a16642bcc3743..6e87f2d128bcfbc93ca8ab2d7819a0144c0199c5 100644 |
| --- a/base/trace_event/memory_dump_manager.cc |
| +++ b/base/trace_event/memory_dump_manager.cc |
| @@ -38,32 +38,38 @@ namespace trace_event { |
| namespace { |
| -// Throttle mmaps at a rate of once every kHeavyMmapsDumpsRate standard dumps. |
| -const int kHeavyDumpsRate = 8; // 250 ms * 8 = 2000 ms. |
| -const int kDumpIntervalMs = 250; |
| const int kTraceEventNumArgs = 1; |
| const char* kTraceEventArgNames[] = {"dumps"}; |
| const unsigned char kTraceEventArgTypes[] = {TRACE_VALUE_TYPE_CONVERTABLE}; |
| StaticAtomicSequenceNumber g_next_guid; |
| uint32 g_periodic_dumps_count = 0; |
| +uint32 g_shortest_dump_interval_ms; |
| MemoryDumpManager* g_instance_for_testing = nullptr; |
| void RequestPeriodicGlobalDump() { |
| - MemoryDumpArgs::LevelOfDetail dump_level_of_detail = |
| - g_periodic_dumps_count == 0 ? MemoryDumpArgs::LevelOfDetail::HIGH |
| - : MemoryDumpArgs::LevelOfDetail::LOW; |
| - if (++g_periodic_dumps_count == kHeavyDumpsRate) |
| - g_periodic_dumps_count = 0; |
| + MemoryDumpArgs dump_args = {MemoryDumpArgs::LevelOfDetail::LOW}; |
| + TraceConfig trace_config = TraceLog::GetInstance()->GetCurrentTraceConfig(); |
| + |
| + // Assign the highest dump args among the periodic dump triggers whose |
| + // interval end at current time. |
| + for (const TraceConfig::MemoryDumpTriggerConfig& config : |
|
Primiano Tucci (use gerrit)
2015/08/26 10:25:06
All this seems way too complex. I don't like the i
|
| + trace_config.memory_dump_config()) { |
| + if (g_periodic_dumps_count % |
| + (config.periodic_interval_ms / g_shortest_dump_interval_ms) == |
| + 0) { |
| + if (dump_args.level_of_detail < config.level_of_detail) |
| + dump_args.level_of_detail = config.level_of_detail; |
| + } |
| + } |
| + g_periodic_dumps_count++; |
| - MemoryDumpArgs dump_args = {dump_level_of_detail}; |
| MemoryDumpManager::GetInstance()->RequestGlobalDump( |
| MemoryDumpType::PERIODIC_INTERVAL, dump_args); |
| } |
| } // namespace |
| -// TODO(ssid): Start using TraceConfig and remove this. |
| // static |
| const char* const MemoryDumpManager::kTraceCategory = |
| TRACE_DISABLED_BY_DEFAULT("memory-infra"); |
| @@ -423,15 +429,35 @@ void MemoryDumpManager::OnTraceLogEnabled() { |
| // when running memory benchmarks until they can be enabled/disabled in |
| // base::trace_event::TraceConfig. See https://goo.gl/5Hj3o0. |
| // The same mechanism should be used to disable periodic dumps in tests. |
| - if (delegate_->IsCoordinatorProcess() && |
| - !CommandLine::ForCurrentProcess()->HasSwitch( |
| - "enable-memory-benchmarking") && |
| - !disable_periodic_dumps_for_testing_) { |
| - g_periodic_dumps_count = 0; |
| - periodic_dump_timer_.Start(FROM_HERE, |
| - TimeDelta::FromMilliseconds(kDumpIntervalMs), |
| - base::Bind(&RequestPeriodicGlobalDump)); |
| + if (!delegate_->IsCoordinatorProcess() || |
| + CommandLine::ForCurrentProcess()->HasSwitch( |
| + "enable-memory-benchmarking") || |
| + disable_periodic_dumps_for_testing_) { |
| + return; |
| } |
| + |
| + g_periodic_dumps_count = 0; |
| + const TraceConfig trace_config = |
| + TraceLog::GetInstance()->GetCurrentTraceConfig(); |
| + const TraceConfig::MemoryDumpConfig& config_list = |
| + trace_config.memory_dump_config(); |
| + if (!config_list.size()) |
|
Primiano Tucci (use gerrit)
2015/08/26 10:25:06
if (config_list.empty()) ?
|
| + return; |
| + |
| + g_shortest_dump_interval_ms = std::numeric_limits<uint32>::max(); |
| + for (const TraceConfig::MemoryDumpTriggerConfig& config : config_list) { |
| + if (g_shortest_dump_interval_ms > config.periodic_interval_ms) |
| + g_shortest_dump_interval_ms = config.periodic_interval_ms; |
| + } |
| + DCHECK_NE(g_shortest_dump_interval_ms, std::numeric_limits<uint32>::max()); |
| + |
| + // It does not make sense to have dumps at varying intervals. |
|
Primiano Tucci (use gerrit)
2015/08/26 10:25:06
Is not that it doesnt' make sense.
The deal is tha
|
| + for (const TraceConfig::MemoryDumpTriggerConfig& config : config_list) |
| + DCHECK_EQ(0u, config.periodic_interval_ms % g_shortest_dump_interval_ms); |
| + |
| + periodic_dump_timer_.Start( |
| + FROM_HERE, TimeDelta::FromMilliseconds(g_shortest_dump_interval_ms), |
| + base::Bind(&RequestPeriodicGlobalDump)); |
| } |
| void MemoryDumpManager::OnTraceLogDisabled() { |