Home | History | Annotate | Download | only in threading
      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