xref: /aosp_15_r20/external/cronet/base/task/thread_pool/worker_thread_set.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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) const14 bool 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)24 void 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()34 WorkerThreadWaitableEvent* 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() const44 WorkerThreadWaitableEvent* WorkerThreadSet::Peek() const {
45   if (IsEmpty())
46     return nullptr;
47   return *set_.begin();
48 }
49 
Contains(const WorkerThreadWaitableEvent * worker) const50 bool WorkerThreadSet::Contains(const WorkerThreadWaitableEvent* worker) const {
51   return set_.count(const_cast<WorkerThreadWaitableEvent*>(worker)) > 0;
52 }
53 
Remove(const WorkerThreadWaitableEvent * worker)54 void 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