OLD | NEW |
| (Empty) |
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/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 | |
OLD | NEW |