• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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   // WorkerThread:
51   void JoinForTesting() override;
52   void Cleanup() override;
53   Delegate* delegate() override;
54 
55  private:
56   const std::unique_ptr<Delegate> delegate_;
57 
58   ~WorkerThreadWaitableEvent() override;
59 };
60 
61 }  // namespace internal
62 }  // namespace base
63 
64 #endif  // BASE_TASK_THREAD_POOL_WORKER_THREAD_WAITABLE_EVENT_H_
65