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)14HierarchicalTimingWheelHandle::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)20HierarchicalTimingWheelHandle& 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() const31HierarchicalTimingWheelHandle::GetTimingWheelHandle() const { 32 return timing_wheel_handle_; 33 } 34 SetTimingWheelHandle(internal::TimingWheelHandle timing_wheel_handle)35void 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()42void HierarchicalTimingWheelHandle::ClearTimingWheelHandle() { 43 timing_wheel_handle_.Reset(); 44 } 45 GetHeapHandle()46HeapHandle HierarchicalTimingWheelHandle::GetHeapHandle() { 47 return heap_handle_; 48 } 49 SetHeapHandle(HeapHandle heap_handle)50void HierarchicalTimingWheelHandle::SetHeapHandle(HeapHandle heap_handle) { 51 DCHECK(heap_handle.IsValid()); 52 DCHECK(!timing_wheel_handle_.IsValid()); 53 heap_handle_ = heap_handle; 54 } 55 ClearHeapHandle()56void HierarchicalTimingWheelHandle::ClearHeapHandle() { 57 heap_handle_.reset(); 58 } 59 GetHierarchyIndex() const60size_t HierarchicalTimingWheelHandle::GetHierarchyIndex() const { 61 return hierarchy_index_; 62 } 63 SetHierarchyIndex(size_t hierarchy_index)64void HierarchicalTimingWheelHandle::SetHierarchyIndex(size_t hierarchy_index) { 65 DCHECK(hierarchy_index != kInvalidIndex); 66 hierarchy_index_ = hierarchy_index; 67 } 68 ClearHierarchyIndex()69void HierarchicalTimingWheelHandle::ClearHierarchyIndex() { 70 hierarchy_index_ = kInvalidIndex; 71 } 72 73 // static Invalid()74HierarchicalTimingWheelHandle HierarchicalTimingWheelHandle::Invalid() { 75 return HierarchicalTimingWheelHandle(); 76 } 77 IsValid() const78bool HierarchicalTimingWheelHandle::IsValid() const { 79 return (timing_wheel_handle_.IsValid() || heap_handle_.IsValid()) && 80 hierarchy_index_ != kInvalidIndex; 81 } 82 83 } // namespace base::sequence_manager 84