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 14 namespace base { 15 16 namespace { 17 18 LazyInstance<ThreadLocalBoolean, LeakyLazyInstanceTraits<ThreadLocalBoolean> > 19 g_io_disallowed(LINKER_INITIALIZED); 20 21 LazyInstance<ThreadLocalBoolean, LeakyLazyInstanceTraits<ThreadLocalBoolean> > 22 g_singleton_disallowed(LINKER_INITIALIZED); 23 24 } // anonymous namespace 25 26 // static 27 bool 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 34 void 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 45 bool 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 52 void 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