Index: base/thread_restrictions.cc |
diff --git a/base/thread_restrictions.cc b/base/thread_restrictions.cc |
index 270d66374bb9b0e65e343497732970aaf95aa0a0..6767d80584e887e284ed8886590d536a1bf0b52c 100644 |
--- a/base/thread_restrictions.cc |
+++ b/base/thread_restrictions.cc |
@@ -18,13 +18,16 @@ namespace { |
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 @@ void ThreadRestrictions::AssertIOAllowed() { |
} |
} |
+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 |