blob: fd21fce834949be99aa386a1e12362a103368d48 [file] [log] [blame]
// 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