Chromium Code Reviews| Index: base/trace_event/memory_dump_scheduler.cc |
| diff --git a/base/trace_event/memory_dump_scheduler.cc b/base/trace_event/memory_dump_scheduler.cc |
| index 14c0f7e188f45b3178c185741b8788c088ee1cf1..56cab18afd1cadbfd05a942f031b85db227aaf09 100644 |
| --- a/base/trace_event/memory_dump_scheduler.cc |
| +++ b/base/trace_event/memory_dump_scheduler.cc |
| @@ -42,16 +42,16 @@ void MemoryDumpScheduler::AddTrigger(MemoryDumpType trigger_type, |
| uint32_t min_time_between_dumps_ms) { |
| if (trigger_type == MemoryDumpType::PEAK_MEMORY_USAGE) { |
| DCHECK(!periodic_state_.is_configured); |
| - DCHECK(!polling_state_.is_configured); |
| + DCHECK_EQ(PollingTriggerState::DISABLED, polling_state_.current_state); |
| DCHECK_NE(0u, min_time_between_dumps_ms); |
| polling_state_.level_of_detail = level_of_detail; |
| polling_state_.min_polls_between_dumps = |
| (min_time_between_dumps_ms + polling_state_.polling_interval_ms - 1) / |
| polling_state_.polling_interval_ms; |
| - polling_state_.is_configured = true; |
| + polling_state_.current_state = PollingTriggerState::CONFIGURED; |
| } else if (trigger_type == MemoryDumpType::PERIODIC_INTERVAL) { |
| - DCHECK(!polling_state_.is_configured); |
| + DCHECK_EQ(PollingTriggerState::DISABLED, polling_state_.current_state); |
| periodic_state_.is_configured = true; |
| DCHECK_NE(0u, min_time_between_dumps_ms); |
| switch (level_of_detail) { |
| @@ -92,21 +92,30 @@ void MemoryDumpScheduler::NotifyPeriodicTriggerSupported() { |
| } |
| void MemoryDumpScheduler::NotifyPollingSupported() { |
| - if (!polling_state_.is_configured || polling_state_.is_polling_enabled) |
| + if (polling_state_.current_state != PollingTriggerState::CONFIGURED) |
| return; |
| - polling_state_.is_polling_enabled = true; |
| - for (uint32_t i = 0; |
| - i < PollingTriggerState::kNumTotalsTrackedForPeakDetection; ++i) { |
| - polling_state_.last_memory_totals_kb[i] = 0; |
| - } |
| - polling_state_.last_memory_totals_kb_index = 0; |
| - polling_state_.num_polls_from_last_dump = 0; |
| - polling_state_.last_dump_memory_total = 0; |
| + polling_state_.current_state = PollingTriggerState::ENABLED; |
| + |
| + polling_state_.ResetTotals(); |
| polling_state_.polling_task_runner->PostTask( |
| FROM_HERE, |
| Bind(&MemoryDumpScheduler::PollMemoryOnPollingThread, Unretained(this))); |
| } |
| +void MemoryDumpScheduler::NotifyDumpTriggered() { |
| + if (polling_state_.polling_task_runner && |
| + ThreadTaskRunnerHandle::Get() != polling_state_.polling_task_runner) { |
|
Primiano Tucci (use gerrit)
2017/03/10 10:35:39
do you really want to compare the TaskRunnerHandle
ssid
2017/03/10 23:51:10
Yes my bad. Fixed it.
|
| + polling_state_.polling_task_runner->PostTask( |
| + FROM_HERE, |
| + Bind(&MemoryDumpScheduler::NotifyDumpTriggered, Unretained(this))); |
|
Primiano Tucci (use gerrit)
2017/03/10 10:35:39
Also I just realized that these Unretained aren't
ssid
2017/03/10 14:57:37
The reason why the unretained should be safe here
|
| + return; |
| + } |
| + if (polling_state_.current_state != PollingTriggerState::ENABLED) |
| + return; |
| + |
| + polling_state_.ResetTotals(); |
| +} |
| + |
| void MemoryDumpScheduler::DisableAllTriggers() { |
| if (periodic_state_.timer.IsRunning()) |
| periodic_state_.timer.Stop(); |
| @@ -120,8 +129,7 @@ void MemoryDumpScheduler::DisablePolling() { |
| Bind(&MemoryDumpScheduler::DisablePolling, Unretained(this)))) |
| return; |
| } |
| - polling_state_.is_polling_enabled = false; |
| - polling_state_.is_configured = false; |
| + polling_state_.current_state = PollingTriggerState::DISABLED; |
| polling_state_.polling_task_runner = nullptr; |
| } |
| @@ -148,7 +156,7 @@ void MemoryDumpScheduler::RequestPeriodicGlobalDump() { |
| } |
| void MemoryDumpScheduler::PollMemoryOnPollingThread() { |
| - if (!polling_state_.is_configured) |
| + if (polling_state_.current_state != PollingTriggerState::ENABLED) |
| return; |
| uint64_t polled_memory = 0; |
| @@ -198,15 +206,8 @@ bool MemoryDumpScheduler::ShouldTriggerDump(uint64_t current_memory_total) { |
| should_dump |= |
| increase_from_last_dump > polling_state_.memory_increase_threshold; |
| should_dump |= IsCurrentSamplePeak(current_memory_total); |
| - if (should_dump) { |
| - polling_state_.last_dump_memory_total = current_memory_total; |
| - polling_state_.num_polls_from_last_dump = 0; |
| - for (uint32_t i = 0; |
| - i < PollingTriggerState::kNumTotalsTrackedForPeakDetection; ++i) { |
| - polling_state_.last_memory_totals_kb[i] = 0; |
| - } |
| - polling_state_.last_memory_totals_kb_index = 0; |
| - } |
| + if (should_dump) |
| + polling_state_.ResetTotals(); |
| return should_dump; |
| } |
| @@ -267,8 +268,7 @@ MemoryDumpScheduler::PeriodicTriggerState::~PeriodicTriggerState() { |
| MemoryDumpScheduler::PollingTriggerState::PollingTriggerState( |
| scoped_refptr<SingleThreadTaskRunner> polling_task_runner) |
| - : is_configured(false), |
| - is_polling_enabled(false), |
| + : current_state(DISABLED), |
| level_of_detail(MemoryDumpLevelOfDetail::FIRST), |
| polling_task_runner(polling_task_runner), |
| polling_interval_ms(g_polling_interval_ms_for_testing |
| @@ -284,5 +284,16 @@ MemoryDumpScheduler::PollingTriggerState::~PollingTriggerState() { |
| DCHECK(!polling_task_runner); |
| } |
| +void MemoryDumpScheduler::PollingTriggerState::ResetTotals() { |
| + if (last_memory_totals_kb_index) { |
| + last_dump_memory_total = |
| + last_memory_totals_kb[last_memory_totals_kb_index] * 1024; |
| + } |
| + num_polls_from_last_dump = 0; |
| + for (uint32_t i = 0; i < kNumTotalsTrackedForPeakDetection; ++i) |
| + last_memory_totals_kb[i] = 0; |
| + last_memory_totals_kb_index = 0; |
| +} |
| + |
| } // namespace trace_event |
| } // namespace base |