diff options
Diffstat (limited to 'base/trace_event/memory_dump_scheduler.h')
-rw-r--r-- | base/trace_event/memory_dump_scheduler.h | 141 |
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 |