#ifndef BASE_TRACE_EVENT_MEMORY_DUMP_SCHEDULER_H_
#define BASE_TRACE_EVENT_MEMORY_DUMP_SCHEDULER_H_
#include <stdint.h>
#include <vector>
#include "base/base_export.h"
#include "base/functional/callback.h"
#include "base/trace_event/memory_dump_request_args.h"
namespace base {
class SequencedTaskRunner;
namespace trace_event {
class BASE_EXPORT MemoryDumpScheduler {
public:
using PeriodicCallback = RepeatingCallback<void(MemoryDumpLevelOfDetail)>;
struct BASE_EXPORT Config {
struct Trigger {
MemoryDumpLevelOfDetail level_of_detail;
uint32_t period_ms;
};
Config();
Config(const Config&);
~Config();
std::vector<Trigger> triggers;
PeriodicCallback callback;
};
static MemoryDumpScheduler* GetInstance();
MemoryDumpScheduler(const MemoryDumpScheduler&) = delete;
MemoryDumpScheduler& operator=(const MemoryDumpScheduler&) = delete;
void Start(Config, scoped_refptr<SequencedTaskRunner> task_runner);
void Stop();
bool is_enabled_for_testing() const { return bool(task_runner_); }
private:
friend class MemoryDumpSchedulerTest;
MemoryDumpScheduler();
~MemoryDumpScheduler();
void StartInternal(Config);
void StopInternal();
void Tick(uint32_t expected_generation);
scoped_refptr<SequencedTaskRunner> task_runner_;
uint32_t period_ms_ = 0;
uint32_t generation_ = 0;
uint32_t tick_count_;
uint32_t light_dump_rate_;
uint32_t heavy_dump_rate_;
PeriodicCallback callback_;
};
}
}
#endif