15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_THREADING_NON_THREAD_SAFE_IMPL_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_THREADING_NON_THREAD_SAFE_IMPL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_export.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_checker_impl.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Full implementation of NonThreadSafe, for debug mode or for occasional
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// temporary use in release mode e.g. when you need to CHECK on a thread
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bug that only occurs in the wild.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: You should almost always use the NonThreadSafe class to get
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the right version of the class for your build configuration.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT NonThreadSafeImpl {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CalledOnValidThread() const;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~NonThreadSafeImpl();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Changes the thread that is checked for in CalledOnValidThread. The next
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // call to CalledOnValidThread will attach this class to a new thread. It is
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // up to the NonThreadSafe derived class to decide to expose this or not.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This may be useful when an object may be created on one thread and then
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // used exclusively on another thread.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DetachFromThread();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThreadCheckerImpl thread_checker_;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // BASE_THREADING_NON_THREAD_SAFE_IMPL_H_
40