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