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

Unified Diff: base/trace_event/memory_dump_scheduler.cc

Issue 2736283003: [memory-infra] MemoryDumpScheduler follows config for time between dumps (Closed)
Patch Set: rebase. Created 3 years, 9 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/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
« no previous file with comments | « base/trace_event/memory_dump_scheduler.h ('k') | services/resource_coordinator/memory/coordinator/coordinator_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698