| // 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 <stdint.h> | 
 |  | 
 | #include <vector> | 
 |  | 
 | #include "base/base_export.h" | 
 | #include "base/callback.h" | 
 | #include "base/memory/ref_counted.h" | 
 | #include "base/trace_event/memory_dump_request_args.h" | 
 |  | 
 | namespace base { | 
 | class SequencedTaskRunner; | 
 |  | 
 | namespace trace_event { | 
 |  | 
 | // Schedules global dump requests based on the triggers added. The methods of | 
 | // this class are NOT thread safe and the client has to take care of invoking | 
 | // all the methods of the class safely. | 
 | class BASE_EXPORT MemoryDumpScheduler { | 
 |  public: | 
 |   using PeriodicCallback = RepeatingCallback<void(MemoryDumpLevelOfDetail)>; | 
 |  | 
 |   // Passed to Start(). | 
 |   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(); | 
 |  | 
 |   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); | 
 |  | 
 |   // Accessed only by the public methods (never from the task runner itself). | 
 |   scoped_refptr<SequencedTaskRunner> task_runner_; | 
 |  | 
 |   // These fields instead are only accessed from within the task runner. | 
 |   uint32_t period_ms_;   // 0 == disabled. | 
 |   uint32_t generation_;  // Used to invalidate outstanding tasks after Stop(). | 
 |   uint32_t tick_count_; | 
 |   uint32_t light_dump_rate_; | 
 |   uint32_t heavy_dump_rate_; | 
 |   PeriodicCallback callback_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(MemoryDumpScheduler); | 
 | }; | 
 |  | 
 | }  // namespace trace_event | 
 | }  // namespace base | 
 |  | 
 | #endif  // BASE_TRACE_EVENT_MEMORY_DUMP_SCHEDULER_H |