1 // Copyright 2017 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/task_queue.h" 6 7 #include <optional> 8 #include <utility> 9 10 #include "base/functional/bind.h" 11 #include "base/memory/ptr_util.h" 12 #include "base/memory/weak_ptr.h" 13 #include "base/task/sequence_manager/associated_thread_id.h" 14 #include "base/task/sequence_manager/sequence_manager_impl.h" 15 #include "base/task/sequence_manager/task_queue_impl.h" 16 #include "base/threading/thread_checker.h" 17 #include "base/threading/thread_checker_impl.h" 18 #include "base/time/time.h" 19 #include "base/trace_event/base_tracing.h" 20 21 namespace base::sequence_manager { 22 QueueEnabledVoter(WeakPtr<internal::TaskQueueImpl> task_queue)23TaskQueue::QueueEnabledVoter::QueueEnabledVoter( 24 WeakPtr<internal::TaskQueueImpl> task_queue) 25 : task_queue_(std::move(task_queue)) { 26 task_queue_->AddQueueEnabledVoter(enabled_, *this); 27 } 28 ~QueueEnabledVoter()29TaskQueue::QueueEnabledVoter::~QueueEnabledVoter() { 30 if (task_queue_) { 31 task_queue_->RemoveQueueEnabledVoter(enabled_, *this); 32 } 33 } 34 SetVoteToEnable(bool enabled)35void TaskQueue::QueueEnabledVoter::SetVoteToEnable(bool enabled) { 36 if (enabled == enabled_) { 37 return; 38 } 39 enabled_ = enabled; 40 if (task_queue_) { 41 task_queue_->OnQueueEnabledVoteChanged(enabled_); 42 } 43 } 44 TaskTiming(bool has_wall_time,bool has_thread_time)45TaskQueue::TaskTiming::TaskTiming(bool has_wall_time, bool has_thread_time) 46 : has_wall_time_(has_wall_time), has_thread_time_(has_thread_time) {} 47 RecordTaskStart(LazyNow * now)48void TaskQueue::TaskTiming::RecordTaskStart(LazyNow* now) { 49 DCHECK_EQ(State::NotStarted, state_); 50 state_ = State::Running; 51 52 if (has_wall_time()) 53 start_time_ = now->Now(); 54 if (has_thread_time()) 55 start_thread_time_ = base::ThreadTicks::Now(); 56 } 57 RecordTaskEnd(LazyNow * now)58void TaskQueue::TaskTiming::RecordTaskEnd(LazyNow* now) { 59 DCHECK(state_ == State::Running || state_ == State::Finished); 60 if (state_ == State::Finished) 61 return; 62 state_ = State::Finished; 63 64 if (has_wall_time()) 65 end_time_ = now->Now(); 66 if (has_thread_time()) 67 end_thread_time_ = base::ThreadTicks::Now(); 68 } 69 Handle(std::unique_ptr<internal::TaskQueueImpl> task_queue)70TaskQueue::Handle::Handle(std::unique_ptr<internal::TaskQueueImpl> task_queue) 71 : task_queue_(std::move(task_queue)), 72 sequence_manager_(task_queue_->GetSequenceManagerWeakPtr()) {} 73 74 TaskQueue::Handle::Handle() = default; 75 ~Handle()76TaskQueue::Handle::~Handle() { 77 reset(); 78 } 79 get() const80TaskQueue* TaskQueue::Handle::get() const { 81 return task_queue_.get(); 82 } 83 operator ->() const84TaskQueue* TaskQueue::Handle::operator->() const { 85 return task_queue_.get(); 86 } 87 reset()88void TaskQueue::Handle::reset() { 89 if (!task_queue_) { 90 return; 91 } 92 // Sequence manager already unregistered the task queue. 93 if (task_queue_->IsUnregistered()) { 94 task_queue_.reset(); 95 return; 96 } 97 CHECK(sequence_manager_); 98 sequence_manager_->UnregisterTaskQueueImpl(std::move(task_queue_)); 99 } 100 101 TaskQueue::Handle::Handle(TaskQueue::Handle&& other) = default; 102 103 TaskQueue::Handle& TaskQueue::Handle::operator=(TaskQueue::Handle&&) = default; 104 105 } // namespace base::sequence_manager 106