summaryrefslogtreecommitdiff
path: root/base/trace_event/memory_dump_scheduler.h
blob: fd21fce834949be99aa386a1e12362a103368d48 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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