• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2022 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/task/sequence_manager/hierarchical_timing_wheel.h"
6 
7 namespace base::sequence_manager {
8 
9 ////////////////////////////////////////////////////////////////////////////////
10 // HierarchicalTimingWheelHandle
11 
12 HierarchicalTimingWheelHandle::HierarchicalTimingWheelHandle() = default;
13 
HierarchicalTimingWheelHandle(HierarchicalTimingWheelHandle && other)14 HierarchicalTimingWheelHandle::HierarchicalTimingWheelHandle(
15     HierarchicalTimingWheelHandle&& other) noexcept
16     : timing_wheel_handle_(std::move(other.timing_wheel_handle_)),
17       heap_handle_(std::move(other.heap_handle_)),
18       hierarchy_index_(std::exchange(other.hierarchy_index_, kInvalidIndex)) {}
19 
operator =(HierarchicalTimingWheelHandle && other)20 HierarchicalTimingWheelHandle& HierarchicalTimingWheelHandle::operator=(
21     HierarchicalTimingWheelHandle&& other) noexcept {
22   timing_wheel_handle_ = std::move(other.timing_wheel_handle_);
23   heap_handle_ = std::move(other.heap_handle_);
24   hierarchy_index_ = std::exchange(other.hierarchy_index_, kInvalidIndex);
25   return *this;
26 }
27 
28 HierarchicalTimingWheelHandle::~HierarchicalTimingWheelHandle() = default;
29 
30 internal::TimingWheelHandle
GetTimingWheelHandle() const31 HierarchicalTimingWheelHandle::GetTimingWheelHandle() const {
32   return timing_wheel_handle_;
33 }
34 
SetTimingWheelHandle(internal::TimingWheelHandle timing_wheel_handle)35 void HierarchicalTimingWheelHandle::SetTimingWheelHandle(
36     internal::TimingWheelHandle timing_wheel_handle) {
37   DCHECK(timing_wheel_handle.IsValid());
38   DCHECK(!heap_handle_.IsValid());
39   timing_wheel_handle_ = timing_wheel_handle;
40 }
41 
ClearTimingWheelHandle()42 void HierarchicalTimingWheelHandle::ClearTimingWheelHandle() {
43   timing_wheel_handle_.Reset();
44 }
45 
GetHeapHandle()46 HeapHandle HierarchicalTimingWheelHandle::GetHeapHandle() {
47   return heap_handle_;
48 }
49 
SetHeapHandle(HeapHandle heap_handle)50 void HierarchicalTimingWheelHandle::SetHeapHandle(HeapHandle heap_handle) {
51   DCHECK(heap_handle.IsValid());
52   DCHECK(!timing_wheel_handle_.IsValid());
53   heap_handle_ = heap_handle;
54 }
55 
ClearHeapHandle()56 void HierarchicalTimingWheelHandle::ClearHeapHandle() {
57   heap_handle_.reset();
58 }
59 
GetHierarchyIndex() const60 size_t HierarchicalTimingWheelHandle::GetHierarchyIndex() const {
61   return hierarchy_index_;
62 }
63 
SetHierarchyIndex(size_t hierarchy_index)64 void HierarchicalTimingWheelHandle::SetHierarchyIndex(size_t hierarchy_index) {
65   DCHECK(hierarchy_index != kInvalidIndex);
66   hierarchy_index_ = hierarchy_index;
67 }
68 
ClearHierarchyIndex()69 void HierarchicalTimingWheelHandle::ClearHierarchyIndex() {
70   hierarchy_index_ = kInvalidIndex;
71 }
72 
73 // static
Invalid()74 HierarchicalTimingWheelHandle HierarchicalTimingWheelHandle::Invalid() {
75   return HierarchicalTimingWheelHandle();
76 }
77 
IsValid() const78 bool HierarchicalTimingWheelHandle::IsValid() const {
79   return (timing_wheel_handle_.IsValid() || heap_handle_.IsValid()) &&
80          hierarchy_index_ != kInvalidIndex;
81 }
82 
83 }  // namespace base::sequence_manager
84