| 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
|
|
|