1 // Copyright 2016 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/thread_pool/worker_thread_set.h" 6 7 #include "base/check_op.h" 8 #include "base/containers/contains.h" 9 #include "base/ranges/algorithm.h" 10 #include "base/task/thread_pool/worker_thread_waitable_event.h" 11 12 namespace base::internal { 13 operator ()(const WorkerThreadWaitableEvent * a,const WorkerThreadWaitableEvent * b) const14bool WorkerThreadSet::Compare::operator()( 15 const WorkerThreadWaitableEvent* a, 16 const WorkerThreadWaitableEvent* b) const { 17 return a->sequence_num() < b->sequence_num(); 18 } 19 20 WorkerThreadSet::WorkerThreadSet() = default; 21 22 WorkerThreadSet::~WorkerThreadSet() = default; 23 Insert(WorkerThreadWaitableEvent * worker)24void WorkerThreadSet::Insert(WorkerThreadWaitableEvent* worker) { 25 DCHECK(!Contains(worker)) << "WorkerThread already on stack"; 26 auto old_first = set_.begin(); 27 set_.insert(worker); 28 if (worker != *set_.begin()) 29 worker->BeginUnusedPeriod(); 30 else if (old_first != set_.end()) 31 (*old_first)->BeginUnusedPeriod(); 32 } 33 Take()34WorkerThreadWaitableEvent* WorkerThreadSet::Take() { 35 if (IsEmpty()) 36 return nullptr; 37 WorkerThreadWaitableEvent* const worker = *set_.begin(); 38 set_.erase(set_.begin()); 39 if (!IsEmpty()) 40 (*set_.begin())->EndUnusedPeriod(); 41 return worker; 42 } 43 Peek() const44WorkerThreadWaitableEvent* WorkerThreadSet::Peek() const { 45 if (IsEmpty()) 46 return nullptr; 47 return *set_.begin(); 48 } 49 Contains(const WorkerThreadWaitableEvent * worker) const50bool WorkerThreadSet::Contains(const WorkerThreadWaitableEvent* worker) const { 51 return set_.count(const_cast<WorkerThreadWaitableEvent*>(worker)) > 0; 52 } 53 Remove(const WorkerThreadWaitableEvent * worker)54void WorkerThreadSet::Remove(const WorkerThreadWaitableEvent* worker) { 55 DCHECK(!IsEmpty()); 56 DCHECK_NE(worker, *set_.begin()); 57 auto it = set_.find(const_cast<WorkerThreadWaitableEvent*>(worker)); 58 CHECK(it != set_.end(), base::NotFatalUntil::M125); 59 DCHECK_NE(TimeTicks(), (*it)->GetLastUsedTime()); 60 set_.erase(it); 61 } 62 63 } // namespace base::internal 64