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