huangcm
2025-02-24 69ed55dec4b2116a19e4cca4393cbc014fce5fb2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// 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/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 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);
 
  // 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;
 
  // 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 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_