| Index: base/thread_restrictions.cc
 | 
| ===================================================================
 | 
| --- base/thread_restrictions.cc	(revision 66806)
 | 
| +++ base/thread_restrictions.cc	(working copy)
 | 
| @@ -18,13 +18,16 @@
 | 
|  LazyInstance<ThreadLocalBoolean, LeakyLazyInstanceTraits<ThreadLocalBoolean> >
 | 
|      g_io_disallowed(LINKER_INITIALIZED);
 | 
|  
 | 
| +LazyInstance<ThreadLocalBoolean, LeakyLazyInstanceTraits<ThreadLocalBoolean> >
 | 
| +    g_singleton_disallowed(LINKER_INITIALIZED);
 | 
| +
 | 
|  }  // anonymous namespace
 | 
|  
 | 
|  // static
 | 
|  bool ThreadRestrictions::SetIOAllowed(bool allowed) {
 | 
| -  bool previous_allowed = g_io_disallowed.Get().Get();
 | 
| +  bool previous_disallowed = g_io_disallowed.Get().Get();
 | 
|    g_io_disallowed.Get().Set(!allowed);
 | 
| -  return !previous_allowed;
 | 
| +  return !previous_disallowed;
 | 
|  }
 | 
|  
 | 
|  // static
 | 
| @@ -39,6 +42,22 @@
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +bool ThreadRestrictions::SetSingletonAllowed(bool allowed) {
 | 
| +  bool previous_disallowed = g_singleton_disallowed.Get().Get();
 | 
| +  g_singleton_disallowed.Get().Set(!allowed);
 | 
| +  return !previous_disallowed;
 | 
| +}
 | 
| +
 | 
| +// static
 | 
| +void ThreadRestrictions::AssertSingletonAllowed() {
 | 
| +  if (g_singleton_disallowed.Get().Get()) {
 | 
| +    LOG(FATAL) << "LazyInstance/Singleton is not allowed to be used on this "
 | 
| +               << "thread.  Most likely it's because this thread is not "
 | 
| +               << "joinable, so AtExitManager may have deleted the object "
 | 
| +               << "on shutdown, leading to a potential shutdown crash.";
 | 
| +  }
 | 
| +}
 | 
| +
 | 
|  }  // namespace base
 | 
|  
 | 
|  #endif  // NDEBUG
 | 
| 
 |