summaryrefslogtreecommitdiff
path: root/base/trace_event/memory_dump_scheduler.h
diff options
context:
space:
mode:
Diffstat (limited to 'base/trace_event/memory_dump_scheduler.h')
-rw-r--r--base/trace_event/memory_dump_scheduler.h141
1 files changed, 141 insertions, 0 deletions
diff --git a/base/trace_event/memory_dump_scheduler.h b/base/trace_event/memory_dump_scheduler.h
new file mode 100644
index 0000000000..fd21fce834
--- /dev/null
+++ b/base/trace_event/memory_dump_scheduler.h
@@ -0,0 +1,141 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_TRACE_EVENT_MEMORY_DUMP_SCHEDULER_H
+#define BASE_TRACE_EVENT_MEMORY_DUMP_SCHEDULER_H
+
+#include "base/base_export.h"
+#include "base/gtest_prod_util.h"
+#include "base/memory/ref_counted.h"
+#include "base/timer/timer.h"
+#include "base/trace_event/memory_dump_request_args.h"
+
+namespace base {
+class SingleThreadTaskRunner;
+
+namespace trace_event {
+
+class MemoryDumpManager;
+
+// Schedules global dump requests based on the triggers added.
+class BASE_EXPORT MemoryDumpScheduler {
+ public:
+ MemoryDumpScheduler(
+ MemoryDumpManager* mdm_,
+ scoped_refptr<SingleThreadTaskRunner> polling_task_runner);
+ ~MemoryDumpScheduler();
+
+ // Adds triggers for scheduling global dumps. Both periodic and peak triggers
+ // cannot be added together. At the moment the periodic support is limited to
+ // at most one periodic trigger per dump mode and peak triggers are limited to
+ // at most one. All intervals should be an integeral multiple of the smallest
+ // interval specified.
+ void AddTrigger(MemoryDumpType trigger_type,
+ MemoryDumpLevelOfDetail level_of_detail,
+ uint32_t min_time_between_dumps_ms);
+
+ // Starts periodic dumps.
+ void NotifyPeriodicTriggerSupported();
+
+ // Starts polling memory total.
+ void NotifyPollingSupported();
+
+ // Resets time for triggering dump to account for minimum time between the
+ // dumps.
+ void NotifyDumpTriggered();
+
+ // Disables all triggers.
+ void DisableAllTriggers();
+
+ private:
+ friend class MemoryDumpManagerTest;
+ FRIEND_TEST_ALL_PREFIXES(MemoryDumpManagerTest, TestPollingOnDumpThread);
+
+ // Helper class to schdule periodic memory dumps.
+ struct PeriodicTriggerState {
+ PeriodicTriggerState();
+ ~PeriodicTriggerState();
+
+ bool is_configured;
+
+ RepeatingTimer timer;
+ uint32_t dump_count;
+ uint32_t min_timer_period_ms;
+ uint32_t light_dumps_rate;
+ uint32_t heavy_dumps_rate;
+
+ uint32_t light_dump_period_ms;
+ uint32_t heavy_dump_period_ms;
+
+ DISALLOW_COPY_AND_ASSIGN(PeriodicTriggerState);
+ };
+
+ struct PollingTriggerState {
+ enum State {
+ CONFIGURED, // Polling trigger was added.
+ ENABLED, // Polling is running.
+ DISABLED // Polling is disabled.
+ };
+
+ static const uint32_t kMaxNumMemorySamples = 50;
+
+ explicit PollingTriggerState(
+ scoped_refptr<SingleThreadTaskRunner> polling_task_runner);
+ ~PollingTriggerState();
+
+ // Helper to clear the tracked memory totals and poll count from last dump.
+ void ResetTotals();
+
+ State current_state;
+ MemoryDumpLevelOfDetail level_of_detail;
+
+ scoped_refptr<SingleThreadTaskRunner> polling_task_runner;
+ uint32_t polling_interval_ms;
+
+ // Minimum numer of polls after the last dump at which next dump can be
+ // triggered.
+ int min_polls_between_dumps;
+ int num_polls_from_last_dump;
+
+ uint64_t last_dump_memory_total;
+ int64_t memory_increase_threshold;
+ uint64_t last_memory_totals_kb[kMaxNumMemorySamples];
+ uint32_t last_memory_totals_kb_index;
+
+ DISALLOW_COPY_AND_ASSIGN(PollingTriggerState);
+ };
+
+ // Helper to set polling disabled on the polling thread.
+ void DisablePolling();
+
+ // Periodically called by the timer.
+ void RequestPeriodicGlobalDump();
+
+ // Called for polling memory usage and trigger dumps if peak is detected.
+ void PollMemoryOnPollingThread();
+
+ // Returns true if peak memory value is detected.
+ bool ShouldTriggerDump(uint64_t current_memory_total);
+
+ // Helper to detect peaks in memory usage.
+ bool IsCurrentSamplePeak(uint64_t current_memory_total);
+
+ // Must be set before enabling tracing.
+ static void SetPollingIntervalForTesting(uint32_t interval);
+
+ // True if periodic dumping is enabled.
+ bool IsPeriodicTimerRunningForTesting();
+
+ MemoryDumpManager* mdm_;
+
+ PeriodicTriggerState periodic_state_;
+ PollingTriggerState polling_state_;
+
+ DISALLOW_COPY_AND_ASSIGN(MemoryDumpScheduler);
+};
+
+} // namespace trace_event
+} // namespace base
+
+#endif // BASE_TRACE_EVENT_MEMORY_DUMP_SCHEDULER_H