xref: /aosp_15_r20/external/libchrome/base/task_scheduler/scheduler_lock.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright 2016 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #ifndef BASE_TASK_SCHEDULER_SCHEDULER_LOCK_H
6*635a8641SAndroid Build Coastguard Worker #define BASE_TASK_SCHEDULER_SCHEDULER_LOCK_H
7*635a8641SAndroid Build Coastguard Worker 
8*635a8641SAndroid Build Coastguard Worker #include <memory>
9*635a8641SAndroid Build Coastguard Worker 
10*635a8641SAndroid Build Coastguard Worker #include "base/base_export.h"
11*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/synchronization/condition_variable.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/synchronization/lock.h"
14*635a8641SAndroid Build Coastguard Worker #include "base/task_scheduler/scheduler_lock_impl.h"
15*635a8641SAndroid Build Coastguard Worker 
16*635a8641SAndroid Build Coastguard Worker namespace base {
17*635a8641SAndroid Build Coastguard Worker namespace internal {
18*635a8641SAndroid Build Coastguard Worker 
19*635a8641SAndroid Build Coastguard Worker // SchedulerLock should be used anywhere a lock would be used in the scheduler.
20*635a8641SAndroid Build Coastguard Worker // When DCHECK_IS_ON(), lock checking occurs. Otherwise, SchedulerLock is
21*635a8641SAndroid Build Coastguard Worker // equivalent to base::Lock.
22*635a8641SAndroid Build Coastguard Worker //
23*635a8641SAndroid Build Coastguard Worker // The shape of SchedulerLock is as follows:
24*635a8641SAndroid Build Coastguard Worker // SchedulerLock()
25*635a8641SAndroid Build Coastguard Worker //     Default constructor, no predecessor lock.
26*635a8641SAndroid Build Coastguard Worker //     DCHECKs
27*635a8641SAndroid Build Coastguard Worker //         On Acquisition if any scheduler lock is acquired on this thread.
28*635a8641SAndroid Build Coastguard Worker //
29*635a8641SAndroid Build Coastguard Worker // SchedulerLock(const SchedulerLock* predecessor)
30*635a8641SAndroid Build Coastguard Worker //     Constructor that specifies an allowed predecessor for that lock.
31*635a8641SAndroid Build Coastguard Worker //     DCHECKs
32*635a8641SAndroid Build Coastguard Worker //         On Construction if |predecessor| forms a predecessor lock cycle.
33*635a8641SAndroid Build Coastguard Worker //         On Acquisition if the previous lock acquired on the thread is not
34*635a8641SAndroid Build Coastguard Worker //             |predecessor|. Okay if there was no previous lock acquired.
35*635a8641SAndroid Build Coastguard Worker //
36*635a8641SAndroid Build Coastguard Worker // void Acquire()
37*635a8641SAndroid Build Coastguard Worker //     Acquires the lock.
38*635a8641SAndroid Build Coastguard Worker //
39*635a8641SAndroid Build Coastguard Worker // void Release()
40*635a8641SAndroid Build Coastguard Worker //     Releases the lock.
41*635a8641SAndroid Build Coastguard Worker //
42*635a8641SAndroid Build Coastguard Worker // void AssertAcquired().
43*635a8641SAndroid Build Coastguard Worker //     DCHECKs if the lock is not acquired.
44*635a8641SAndroid Build Coastguard Worker //
45*635a8641SAndroid Build Coastguard Worker // std::unique_ptr<ConditionVariable> CreateConditionVariable()
46*635a8641SAndroid Build Coastguard Worker //     Creates a condition variable using this as a lock.
47*635a8641SAndroid Build Coastguard Worker 
48*635a8641SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
49*635a8641SAndroid Build Coastguard Worker class SchedulerLock : public SchedulerLockImpl {
50*635a8641SAndroid Build Coastguard Worker  public:
51*635a8641SAndroid Build Coastguard Worker   SchedulerLock() = default;
SchedulerLock(const SchedulerLock * predecessor)52*635a8641SAndroid Build Coastguard Worker   explicit SchedulerLock(const SchedulerLock* predecessor)
53*635a8641SAndroid Build Coastguard Worker       : SchedulerLockImpl(predecessor) {}
54*635a8641SAndroid Build Coastguard Worker };
55*635a8641SAndroid Build Coastguard Worker #else  // DCHECK_IS_ON()
56*635a8641SAndroid Build Coastguard Worker class SchedulerLock : public Lock {
57*635a8641SAndroid Build Coastguard Worker  public:
58*635a8641SAndroid Build Coastguard Worker   SchedulerLock() = default;
59*635a8641SAndroid Build Coastguard Worker   explicit SchedulerLock(const SchedulerLock*) {}
60*635a8641SAndroid Build Coastguard Worker 
61*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<ConditionVariable> CreateConditionVariable() {
62*635a8641SAndroid Build Coastguard Worker     return std::unique_ptr<ConditionVariable>(new ConditionVariable(this));
63*635a8641SAndroid Build Coastguard Worker   }
64*635a8641SAndroid Build Coastguard Worker };
65*635a8641SAndroid Build Coastguard Worker #endif  // DCHECK_IS_ON()
66*635a8641SAndroid Build Coastguard Worker 
67*635a8641SAndroid Build Coastguard Worker // Provides the same functionality as base::AutoLock for SchedulerLock.
68*635a8641SAndroid Build Coastguard Worker class AutoSchedulerLock {
69*635a8641SAndroid Build Coastguard Worker  public:
AutoSchedulerLock(SchedulerLock & lock)70*635a8641SAndroid Build Coastguard Worker   explicit AutoSchedulerLock(SchedulerLock& lock) : lock_(lock) {
71*635a8641SAndroid Build Coastguard Worker     lock_.Acquire();
72*635a8641SAndroid Build Coastguard Worker   }
73*635a8641SAndroid Build Coastguard Worker 
~AutoSchedulerLock()74*635a8641SAndroid Build Coastguard Worker   ~AutoSchedulerLock() {
75*635a8641SAndroid Build Coastguard Worker     lock_.AssertAcquired();
76*635a8641SAndroid Build Coastguard Worker     lock_.Release();
77*635a8641SAndroid Build Coastguard Worker   }
78*635a8641SAndroid Build Coastguard Worker 
79*635a8641SAndroid Build Coastguard Worker  private:
80*635a8641SAndroid Build Coastguard Worker   SchedulerLock& lock_;
81*635a8641SAndroid Build Coastguard Worker 
82*635a8641SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(AutoSchedulerLock);
83*635a8641SAndroid Build Coastguard Worker };
84*635a8641SAndroid Build Coastguard Worker 
85*635a8641SAndroid Build Coastguard Worker }  // namespace internal
86*635a8641SAndroid Build Coastguard Worker }  // namespace base
87*635a8641SAndroid Build Coastguard Worker 
88*635a8641SAndroid Build Coastguard Worker #endif  // BASE_TASK_SCHEDULER_SCHEDULER_LOCK_H
89