1// Copyright (c) 2011 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_THREADING_THREAD_CHECKER_IMPL_H_
6#define BASE_THREADING_THREAD_CHECKER_IMPL_H_
7#pragma once
8
9#include "base/base_api.h"
10#include "base/synchronization/lock.h"
11#include "base/threading/platform_thread.h"
12
13namespace base {
14
15// Real implementation of ThreadChecker, for use in debug mode, or
16// for temporary use in release mode (e.g. to CHECK on a threading issue
17// seen only in the wild).
18//
19// Note: You should almost always use the ThreadChecker class to get the
20// right version for your build configuration.
21class BASE_API ThreadCheckerImpl {
22 public:
23  ThreadCheckerImpl();
24  ~ThreadCheckerImpl();
25
26  bool CalledOnValidThread() const;
27
28  // Changes the thread that is checked for in CalledOnValidThread.  This may
29  // be useful when an object may be created on one thread and then used
30  // exclusively on another thread.
31  void DetachFromThread();
32
33 private:
34  void EnsureThreadIdAssigned() const;
35
36  mutable base::Lock lock_;
37  // This is mutable so that CalledOnValidThread can set it.
38  // It's guarded by |lock_|.
39  mutable PlatformThreadId valid_thread_id_;
40};
41
42}  // namespace base
43
44#endif  // BASE_THREADING_THREAD_CHECKER_IMPL_H_
45