[email protected] | 399ed42 | 2012-12-27 19:58:00 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
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/sequence_checker_impl.h" | ||||
6 | |||||
fdoray | eed5fa7 | 2016-07-26 22:28:45 | [diff] [blame] | 7 | #include "base/logging.h" |
tzik | 0c2fcf5 | 2017-02-16 08:52:31 | [diff] [blame] | 8 | #include "base/memory/ptr_util.h" |
9 | #include "base/sequence_token.h" | ||||
tzik | 0c2fcf5 | 2017-02-16 08:52:31 | [diff] [blame] | 10 | #include "base/threading/thread_checker_impl.h" |
fdoray | eed5fa7 | 2016-07-26 22:28:45 | [diff] [blame] | 11 | |
[email protected] | 399ed42 | 2012-12-27 19:58:00 | [diff] [blame] | 12 | namespace base { |
13 | |||||
tzik | 0c2fcf5 | 2017-02-16 08:52:31 | [diff] [blame] | 14 | class SequenceCheckerImpl::Core { |
15 | public: | ||||
Francois Doray | 4914ec14 | 2018-02-22 12:48:38 | [diff] [blame] | 16 | Core() : sequence_token_(SequenceToken::GetForCurrentThread()) {} |
[email protected] | 399ed42 | 2012-12-27 19:58:00 | [diff] [blame] | 17 | |
tzik | 0c2fcf5 | 2017-02-16 08:52:31 | [diff] [blame] | 18 | ~Core() = default; |
19 | |||||
gab | 76880239 | 2017-03-31 00:15:17 | [diff] [blame] | 20 | bool CalledOnValidSequence() const { |
tzik | 0c2fcf5 | 2017-02-16 08:52:31 | [diff] [blame] | 21 | if (sequence_token_.IsValid()) |
22 | return sequence_token_ == SequenceToken::GetForCurrentThread(); | ||||
23 | |||||
tzik | 0c2fcf5 | 2017-02-16 08:52:31 | [diff] [blame] | 24 | // SequenceChecker behaves as a ThreadChecker when it is not bound to a |
25 | // valid sequence token. | ||||
26 | return thread_checker_.CalledOnValidThread(); | ||||
27 | } | ||||
28 | |||||
29 | private: | ||||
30 | SequenceToken sequence_token_; | ||||
31 | |||||
Francois Doray | 4914ec14 | 2018-02-22 12:48:38 | [diff] [blame] | 32 | // Used when |sequence_token_| is invalid. |
tzik | 0c2fcf5 | 2017-02-16 08:52:31 | [diff] [blame] | 33 | ThreadCheckerImpl thread_checker_; |
34 | }; | ||||
35 | |||||
Jeremy Roman | 9532f25 | 2017-08-16 23:27:24 | [diff] [blame] | 36 | SequenceCheckerImpl::SequenceCheckerImpl() : core_(std::make_unique<Core>()) {} |
fdoray | eed5fa7 | 2016-07-26 22:28:45 | [diff] [blame] | 37 | SequenceCheckerImpl::~SequenceCheckerImpl() = default; |
[email protected] | 399ed42 | 2012-12-27 19:58:00 | [diff] [blame] | 38 | |
fdoray | e2b19a1 | 2016-07-29 02:30:16 | [diff] [blame] | 39 | bool SequenceCheckerImpl::CalledOnValidSequence() const { |
[email protected] | 399ed42 | 2012-12-27 19:58:00 | [diff] [blame] | 40 | AutoLock auto_lock(lock_); |
tzik | 0c2fcf5 | 2017-02-16 08:52:31 | [diff] [blame] | 41 | if (!core_) |
Jeremy Roman | 9532f25 | 2017-08-16 23:27:24 | [diff] [blame] | 42 | core_ = std::make_unique<Core>(); |
gab | 76880239 | 2017-03-31 00:15:17 | [diff] [blame] | 43 | return core_->CalledOnValidSequence(); |
[email protected] | 399ed42 | 2012-12-27 19:58:00 | [diff] [blame] | 44 | } |
45 | |||||
[email protected] | d52426c | 2013-07-30 19:26:40 | [diff] [blame] | 46 | void SequenceCheckerImpl::DetachFromSequence() { |
[email protected] | 399ed42 | 2012-12-27 19:58:00 | [diff] [blame] | 47 | AutoLock auto_lock(lock_); |
tzik | 0c2fcf5 | 2017-02-16 08:52:31 | [diff] [blame] | 48 | core_.reset(); |
[email protected] | 399ed42 | 2012-12-27 19:58:00 | [diff] [blame] | 49 | } |
50 | |||||
51 | } // namespace base |