|
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 #ifndef BASE_SEQUENCE_CHECKER_IMPL_H_ |
|
6 #define BASE_SEQUENCE_CHECKER_IMPL_H_ |
|
7 |
|
8 #include "base/base_export.h" |
|
9 #include "base/basictypes.h" |
|
10 #include "base/synchronization/lock.h" |
|
11 #include "base/threading/sequenced_worker_pool.h" |
|
12 #include "base/threading/thread_checker_impl.h" |
|
13 |
|
14 namespace base { |
|
15 |
|
16 // SequenceCheckerImpl is used to help verify that some methods of a |
|
17 // class are called in sequence -- that is, called from the same |
|
18 // SequencedTaskRunner. It is a generalization of ThreadChecker; in |
|
19 // particular, it behaves exactly like ThreadChecker if constructed |
|
20 // on a thread that is not part of a SequencedWorkerPool. |
|
21 class BASE_EXPORT SequenceCheckerImpl { |
|
22 public: |
|
23 SequenceCheckerImpl(); |
|
24 ~SequenceCheckerImpl(); |
|
25 |
|
26 // Returns whether the we are being called on the same sequence token |
|
27 // as previous calls. If there is no associated sequence, then returns |
|
28 // whether we are being called on the underlying ThreadChecker's thread. |
|
29 bool CalledOnValidSequencedThread() const; |
|
30 |
|
31 // Unbinds the checker from the currently associated sequence. The |
|
32 // checker will be re-bound on the next call to CalledOnValidSequence(). |
|
33 void DetachFromSequence(); |
|
34 |
|
35 private: |
|
36 void EnsureSequenceTokenAssigned() const; |
|
37 |
|
38 // Guards all variables below. |
|
39 mutable Lock lock_; |
|
40 |
|
41 // Used if |sequence_token_| is not valid. |
|
42 ThreadCheckerImpl thread_checker_; |
|
43 mutable bool sequence_token_assigned_; |
|
44 |
|
45 mutable SequencedWorkerPool::SequenceToken sequence_token_; |
|
46 |
|
47 DISALLOW_COPY_AND_ASSIGN(SequenceCheckerImpl); |
|
48 }; |
|
49 |
|
50 } // namespace base |
|
51 |
|
52 #endif // BASE_SEQUENCE_CHECKER_IMPL_H_ |