// 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.

#include "base/task_scheduler/service_thread.h"

#include "base/debug/alias.h"
#include "base/task_scheduler/post_task.h"
#include "base/task_scheduler/task_tracker.h"
#include "base/task_scheduler/task_traits.h"
#include "base/time/time.h"

namespace base {
namespace internal {

ServiceThread::ServiceThread(const TaskTracker* task_tracker)
    : Thread("TaskSchedulerServiceThread"), task_tracker_(task_tracker) {}

void ServiceThread::Init() {
  if (task_tracker_) {
    heartbeat_latency_timer_.Start(
        FROM_HERE, TimeDelta::FromSeconds(5),
        BindRepeating(&ServiceThread::PerformHeartbeatLatencyReport,
                      Unretained(this)));
  }
}

NOINLINE void ServiceThread::Run(RunLoop* run_loop) {
  const int line_number = __LINE__;
  Thread::Run(run_loop);
  base::debug::Alias(&line_number);
}

void ServiceThread::PerformHeartbeatLatencyReport() const {
  static constexpr TaskTraits kReportedTraits[] = {
      {TaskPriority::BACKGROUND},    {TaskPriority::BACKGROUND, MayBlock()},
      {TaskPriority::USER_VISIBLE},  {TaskPriority::USER_VISIBLE, MayBlock()},
      {TaskPriority::USER_BLOCKING}, {TaskPriority::USER_BLOCKING, MayBlock()}};

  for (auto& traits : kReportedTraits) {
    // Post through the static API to time the full stack. Use a new Now() for
    // every set of traits in case PostTaskWithTraits() itself is slow.
    base::PostTaskWithTraits(
        FROM_HERE, traits,
        BindOnce(&TaskTracker::RecordLatencyHistogram,
                 Unretained(task_tracker_),
                 TaskTracker::LatencyHistogramType::HEARTBEAT_LATENCY, traits,
                 TimeTicks::Now()));
  }
}

}  // namespace internal
}  // namespace base
