// 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_TASK_SCHEDULER_SERVICE_THREAD_H_
#define BASE_TASK_TASK_SCHEDULER_SERVICE_THREAD_H_

#include "base/base_export.h"
#include "base/macros.h"
#include "base/threading/thread.h"
#include "base/time/time.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 record heartbeat metrics. This
  // includes metrics recorded through |report_heartbeat_metrics_callback|,
  // in addition to 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
                         ,RepeatingClosure report_heartbeat_metrics_callback);

  ~ServiceThread() override;

  // Overrides the default interval at which |heartbeat_latency_timer_| fires.
  // Call this with a |heartbeat| of zero to undo the override.
  // Must not be called while the ServiceThread is running.
  static void SetHeartbeatIntervalForTesting(TimeDelta heartbeat);

 private:
  // Thread:
  void Init() override;
  void Run(RunLoop* run_loop) override;

  void ReportHeartbeatMetrics() const;

  // Kicks off a single async task which will record a histogram on the latency
  // of a randomly chosen set of TaskTraits.
  void PerformHeartbeatLatencyReport() const;

  const TaskTracker* const task_tracker_;

  // Fires a recurring heartbeat task to record metrics 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_metrics_timer_;

  RepeatingClosure report_heartbeat_metrics_callback_;

  DISALLOW_COPY_AND_ASSIGN(ServiceThread);
};

}  // namespace internal
}  // namespace base

#endif  // BASE_TASK_TASK_SCHEDULER_SERVICE_THREAD_H_
