xref: /aosp_15_r20/external/cronet/base/task/thread_pool/worker_thread_waitable_event.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2023 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 #ifndef BASE_TASK_THREAD_POOL_WORKER_THREAD_WAITABLE_EVENT_H_
6 #define BASE_TASK_THREAD_POOL_WORKER_THREAD_WAITABLE_EVENT_H_
7 
8 #include "base/task/thread_pool/worker_thread.h"
9 
10 #include <memory>
11 
12 #include "base/base_export.h"
13 #include "base/synchronization/waitable_event.h"
14 #include "base/task/common/checked_lock.h"
15 #include "base/task/thread_pool/tracked_ref.h"
16 
17 namespace base {
18 
19 namespace internal {
20 
21 class BASE_EXPORT WorkerThreadWaitableEvent : public WorkerThread {
22  public:
23   class BASE_EXPORT Delegate : public WorkerThread::Delegate {
24    protected:
25     friend WorkerThreadWaitableEvent;
26     bool TimedWait(TimeDelta timeout) override;
27     // Event to wake up the thread managed by the WorkerThread whose delegate
28     // this is.
29     WaitableEvent wake_up_event_{WaitableEvent::ResetPolicy::AUTOMATIC,
30                                  WaitableEvent::InitialState::NOT_SIGNALED};
31   };
32 
33   // Everything is passed to WorkerThread's constructor, except the Delegate.
34   WorkerThreadWaitableEvent(ThreadType thread_type_hint,
35                             std::unique_ptr<Delegate> delegate,
36                             TrackedRef<TaskTracker> task_tracker,
37                             size_t sequence_num,
38                             const CheckedLock* predecessor_lock = nullptr);
39 
40   WorkerThreadWaitableEvent(const WorkerThread&) = delete;
41   WorkerThreadWaitableEvent& operator=(const WorkerThread&) = delete;
42 
43   // Wakes up this WorkerThreadWaitableEvent if it wasn't already awake. After
44   // this is called, this WorkerThreadWaitableEvent will run Tasks from
45   // TaskSources returned by the GetWork() method of its delegate until it
46   // returns nullptr. No-op if Start() wasn't called. DCHECKs if called after
47   // Start() has failed or after Cleanup() has been called.
48   void WakeUp();
49 
50   // Joins this WorkerThread. If a Task is already running, it will be
51   // allowed to complete its execution. This can only be called once.
52   //
53   // Note: A thread that detaches before JoinForTesting() is called may still be
54   // running after JoinForTesting() returns. However, it can't run tasks after
55   // JoinForTesting() returns.
56   void JoinForTesting();
57 
58   // WorkerThread:
59   void Cleanup() override;
60   Delegate* delegate() override;
61 
62  private:
63   const std::unique_ptr<Delegate> delegate_;
64 
65   // Set once JoinForTesting() has been called.
66   AtomicFlag join_called_for_testing_;
67   bool join_called_for_testing() const override;
68 
69   ~WorkerThreadWaitableEvent() override;
70 };
71 
72 }  // namespace internal
73 }  // namespace base
74 
75 #endif  // BASE_TASK_THREAD_POOL_WORKER_THREAD_WAITABLE_EVENT_H_
76