1// Copyright (c) 2010 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#include "base/threading/thread_restrictions.h"
6
7// This entire file is compiled out in Release mode.
8#ifndef NDEBUG
9
10#include "base/lazy_instance.h"
11#include "base/logging.h"
12#include "base/threading/thread_local.h"
13
14namespace base {
15
16namespace {
17
18LazyInstance<ThreadLocalBoolean, LeakyLazyInstanceTraits<ThreadLocalBoolean> >
19    g_io_disallowed(LINKER_INITIALIZED);
20
21LazyInstance<ThreadLocalBoolean, LeakyLazyInstanceTraits<ThreadLocalBoolean> >
22    g_singleton_disallowed(LINKER_INITIALIZED);
23
24}  // anonymous namespace
25
26// static
27bool ThreadRestrictions::SetIOAllowed(bool allowed) {
28  bool previous_disallowed = g_io_disallowed.Get().Get();
29  g_io_disallowed.Get().Set(!allowed);
30  return !previous_disallowed;
31}
32
33// static
34void ThreadRestrictions::AssertIOAllowed() {
35  if (g_io_disallowed.Get().Get()) {
36    LOG(FATAL) <<
37        "Function marked as IO-only was called from a thread that "
38        "disallows IO!  If this thread really should be allowed to "
39        "make IO calls, adjust the call to "
40        "base::ThreadRestrictions::SetIOAllowed() in this thread's "
41        "startup.";
42  }
43}
44
45bool ThreadRestrictions::SetSingletonAllowed(bool allowed) {
46  bool previous_disallowed = g_singleton_disallowed.Get().Get();
47  g_singleton_disallowed.Get().Set(!allowed);
48  return !previous_disallowed;
49}
50
51// static
52void ThreadRestrictions::AssertSingletonAllowed() {
53  if (g_singleton_disallowed.Get().Get()) {
54    LOG(FATAL) << "LazyInstance/Singleton is not allowed to be used on this "
55               << "thread.  Most likely it's because this thread is not "
56               << "joinable, so AtExitManager may have deleted the object "
57               << "on shutdown, leading to a potential shutdown crash.";
58  }
59}
60
61}  // namespace base
62
63#endif  // NDEBUG
64