|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef BASE_SEQUENCE_CHECKER_IMPL_H_ | 
|  | #define BASE_SEQUENCE_CHECKER_IMPL_H_ | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "base/basictypes.h" | 
|  | #include "base/synchronization/lock.h" | 
|  | #include "base/threading/sequenced_worker_pool.h" | 
|  | #include "base/threading/thread_checker_impl.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | // SequenceCheckerImpl is used to help verify that some methods of a | 
|  | // class are called in sequence -- that is, called from the same | 
|  | // SequencedTaskRunner. It is a generalization of ThreadChecker; in | 
|  | // particular, it behaves exactly like ThreadChecker if constructed | 
|  | // on a thread that is not part of a SequencedWorkerPool. | 
|  | class BASE_EXPORT SequenceCheckerImpl { | 
|  | public: | 
|  | SequenceCheckerImpl(); | 
|  | ~SequenceCheckerImpl(); | 
|  |  | 
|  | // Returns whether the we are being called on the same sequence token | 
|  | // as previous calls. If there is no associated sequence, then returns | 
|  | // whether we are being called on the underlying ThreadChecker's thread. | 
|  | bool CalledOnValidSequencedThread() const; | 
|  |  | 
|  | // Unbinds the checker from the currently associated sequence. The | 
|  | // checker will be re-bound on the next call to CalledOnValidSequence(). | 
|  | void DetachFromSequence(); | 
|  |  | 
|  | private: | 
|  | void EnsureSequenceTokenAssigned() const; | 
|  |  | 
|  | // Guards all variables below. | 
|  | mutable Lock lock_; | 
|  |  | 
|  | // Used if |sequence_token_| is not valid. | 
|  | ThreadCheckerImpl thread_checker_; | 
|  | mutable bool sequence_token_assigned_; | 
|  |  | 
|  | mutable SequencedWorkerPool::SequenceToken sequence_token_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(SequenceCheckerImpl); | 
|  | }; | 
|  |  | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_SEQUENCE_CHECKER_IMPL_H_ |