| // Copyright 2018 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_TASK_SCHEDULER_SERVICE_THREAD_H_ | 
 | #define BASE_TASK_SCHEDULER_SERVICE_THREAD_H_ | 
 |  | 
 | #include "base/base_export.h" | 
 | #include "base/macros.h" | 
 | #include "base/threading/thread.h" | 
 | #include "base/timer/timer.h" | 
 |  | 
 | namespace base { | 
 | namespace internal { | 
 |  | 
 | class TaskTracker; | 
 |  | 
 | // The TaskScheduler's ServiceThread is a mostly idle thread that is responsible | 
 | // for handling async events (e.g. delayed tasks and async I/O). Its role is to | 
 | // merely forward such events to their destination (hence staying mostly idle | 
 | // and highly responsive). | 
 | // It aliases Thread::Run() to enforce that ServiceThread::Run() be on the stack | 
 | // and make it easier to identify the service thread in stack traces. | 
 | class BASE_EXPORT ServiceThread : public Thread { | 
 |  public: | 
 |   // Constructs a ServiceThread which will report latency metrics through | 
 |   // |task_tracker| if non-null. In that case, this ServiceThread will assume a | 
 |   // registered TaskScheduler instance and that |task_tracker| will outlive this | 
 |   // ServiceThread. | 
 |   explicit ServiceThread(const TaskTracker* task_tracker); | 
 |  | 
 |  private: | 
 |   // Thread: | 
 |   void Init() override; | 
 |   void Run(RunLoop* run_loop) override; | 
 |  | 
 |   // Kicks off async tasks which will record a histogram on the latency of | 
 |   // various traits. | 
 |   void PerformHeartbeatLatencyReport() const; | 
 |  | 
 |   const TaskTracker* const task_tracker_; | 
 |  | 
 |   // Fires a recurring heartbeat task to record latency histograms which are | 
 |   // independent from any execution sequence. This is done on the service thread | 
 |   // to avoid all external dependencies (even main thread). | 
 |   base::RepeatingTimer heartbeat_latency_timer_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(ServiceThread); | 
 | }; | 
 |  | 
 | }  // namespace internal | 
 | }  // namespace base | 
 |  | 
 | #endif  // BASE_TASK_SCHEDULER_SERVICE_THREAD_H_ |