OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/sequence_checker_impl.h" | 5 #include "base/sequence_checker_impl.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/memory/ptr_util.h" | |
9 #include "base/sequence_token.h" | |
10 #include "base/threading/sequenced_worker_pool.h" | |
11 #include "base/threading/thread_checker_impl.h" | |
8 | 12 |
9 namespace base { | 13 namespace base { |
10 | 14 |
15 class SequenceCheckerImpl::Core { | |
16 public: | |
17 Core() { | |
18 sequence_token_ = SequenceToken::GetForCurrentThread(); | |
19 sequenced_worker_pool_token_ = | |
20 SequencedWorkerPool::GetSequenceTokenForCurrentThread(); | |
21 | |
22 // SequencedWorkerPool doesn't use SequenceToken and code outside of | |
23 // SequenceWorkerPool doesn't set a SequencedWorkerPool token. | |
24 DCHECK(!sequence_token_.IsValid() || | |
25 !sequenced_worker_pool_token_.IsValid()); | |
26 } | |
27 | |
28 ~Core() = default; | |
29 | |
30 bool CalledOnValidThread() const { | |
31 if (sequence_token_.IsValid()) | |
32 return sequence_token_ == SequenceToken::GetForCurrentThread(); | |
33 | |
34 if (sequenced_worker_pool_token_.IsValid()) { | |
35 return sequenced_worker_pool_token_.Equals( | |
36 SequencedWorkerPool::GetSequenceTokenForCurrentThread()); | |
37 } | |
38 | |
39 // SequenceChecker behaves as a ThreadChecker when it is not bound to a | |
40 // valid | |
41 // sequence token. | |
gab
2017/02/13 15:26:39
nit: wrap
tzik
2017/02/14 09:14:36
Done.
| |
42 return thread_checker_.CalledOnValidThread(); | |
43 } | |
44 | |
45 private: | |
46 mutable SequenceToken sequence_token_; | |
gab
2017/02/13 15:26:39
No longer needs to be mutable since |core_| is wha
tzik
2017/02/14 09:14:37
Done.
| |
47 | |
48 // TODO(gab): Remove this when SequencedWorkerPool is deprecated in favor of | |
49 // TaskScheduler. crbug.com/622400 | |
50 mutable SequencedWorkerPool::SequenceToken sequenced_worker_pool_token_; | |
gab
2017/02/13 15:26:39
ditto
tzik
2017/02/14 09:14:36
Done.
| |
51 | |
52 // Used when |sequenced_worker_pool_token_| and |sequence_token_| are invalid. | |
53 ThreadCheckerImpl thread_checker_; | |
54 }; | |
55 | |
11 SequenceCheckerImpl::SequenceCheckerImpl() { | 56 SequenceCheckerImpl::SequenceCheckerImpl() { |
12 AutoLock auto_lock(lock_); | 57 AutoLock auto_lock(lock_); |
13 EnsureSequenceTokenAssigned(); | 58 EnsureSequenceTokenAssigned(); |
14 } | 59 } |
15 | 60 |
16 SequenceCheckerImpl::~SequenceCheckerImpl() = default; | 61 SequenceCheckerImpl::~SequenceCheckerImpl() = default; |
17 | 62 |
18 bool SequenceCheckerImpl::CalledOnValidSequence() const { | 63 bool SequenceCheckerImpl::CalledOnValidSequence() const { |
19 AutoLock auto_lock(lock_); | 64 AutoLock auto_lock(lock_); |
20 EnsureSequenceTokenAssigned(); | 65 EnsureSequenceTokenAssigned(); |
21 | 66 return core_->CalledOnValidThread(); |
22 if (sequence_token_.IsValid()) | |
23 return sequence_token_ == SequenceToken::GetForCurrentThread(); | |
24 | |
25 if (sequenced_worker_pool_token_.IsValid()) { | |
26 return sequenced_worker_pool_token_.Equals( | |
27 SequencedWorkerPool::GetSequenceTokenForCurrentThread()); | |
28 } | |
29 | |
30 // SequenceChecker behaves as a ThreadChecker when it is not bound to a valid | |
31 // sequence token. | |
32 return thread_checker_.CalledOnValidThread(); | |
33 } | 67 } |
34 | 68 |
35 void SequenceCheckerImpl::DetachFromSequence() { | 69 void SequenceCheckerImpl::DetachFromSequence() { |
36 AutoLock auto_lock(lock_); | 70 AutoLock auto_lock(lock_); |
37 is_assigned_ = false; | 71 core_.reset(); |
38 sequence_token_ = SequenceToken(); | |
39 sequenced_worker_pool_token_ = SequencedWorkerPool::SequenceToken(); | |
40 thread_checker_.DetachFromThread(); | |
41 } | 72 } |
42 | 73 |
43 void SequenceCheckerImpl::EnsureSequenceTokenAssigned() const { | 74 void SequenceCheckerImpl::EnsureSequenceTokenAssigned() const { |
gab
2017/02/13 15:26:39
Since this is now simple and only called from two
tzik
2017/02/14 09:14:36
Done.
| |
44 lock_.AssertAcquired(); | 75 lock_.AssertAcquired(); |
45 if (is_assigned_) | 76 if (!core_) |
46 return; | 77 core_ = MakeUnique<Core>(); |
47 | |
48 is_assigned_ = true; | |
49 sequence_token_ = SequenceToken::GetForCurrentThread(); | |
50 sequenced_worker_pool_token_ = | |
51 SequencedWorkerPool::GetSequenceTokenForCurrentThread(); | |
52 | |
53 // SequencedWorkerPool doesn't use SequenceToken and code outside of | |
54 // SequenceWorkerPool doesn't set a SequencedWorkerPool token. | |
55 DCHECK(!sequence_token_.IsValid() || !sequenced_worker_pool_token_.IsValid()); | |
56 } | 78 } |
57 | 79 |
58 } // namespace base | 80 } // namespace base |
OLD | NEW |