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 |