// 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/memory/ref_counted.h" #include "base/synchronization/lock.h" #include "base/threading/thread_checker_impl.h" namespace base { class SequencedTaskRunner; // 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 its passed a // NULL SequencedTaskRunner. class BASE_EXPORT SequenceCheckerImpl { public: // |sequenced_task_runner| can be NULL. In that case, this object // behaves exactly like a ThreadChecker bound to the current thread, // i.e. CalledOnValidSequence() behaves like CalledOnValidThread(). explicit SequenceCheckerImpl( const scoped_refptr& sequenced_task_runner); ~SequenceCheckerImpl(); // Returns whether the we are being called on the underyling // SequencedTaskRunner. If we're not bound to a // |sequenced_task_runner|, returns whether we are being called on // the underlying ThreadChecker's thread. bool CalledOnValidSequence() const; // Changes the underyling SequencedTaskRunner. // |sequenced_task_runner| can be NULL. In that case, this object // behaves exactly like a ThreadChecker that has been detached from // its thread, i.e. we will be bound to the thread on which we next // call CalledOnValidSequence(). void ChangeSequence( const scoped_refptr& sequenced_task_runner); private: // Guards all variables below. mutable Lock lock_; scoped_refptr sequenced_task_runner_; // Used if |sequenced_task_runner_| is NULL. ThreadCheckerImpl thread_checker_; DISALLOW_COPY_AND_ASSIGN(SequenceCheckerImpl); }; } // namespace base #endif // BASE_SEQUENCE_CHECKER_IMPL_H_