xref: /aosp_15_r20/external/libchrome/base/threading/thread_restrictions.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #ifndef BASE_THREADING_THREAD_RESTRICTIONS_H_
6*635a8641SAndroid Build Coastguard Worker #define BASE_THREADING_THREAD_RESTRICTIONS_H_
7*635a8641SAndroid Build Coastguard Worker 
8*635a8641SAndroid Build Coastguard Worker #include "base/base_export.h"
9*635a8641SAndroid Build Coastguard Worker #include "base/gtest_prod_util.h"
10*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
11*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
12*635a8641SAndroid Build Coastguard Worker 
13*635a8641SAndroid Build Coastguard Worker class BrowserProcessImpl;
14*635a8641SAndroid Build Coastguard Worker class HistogramSynchronizer;
15*635a8641SAndroid Build Coastguard Worker class NativeBackendKWallet;
16*635a8641SAndroid Build Coastguard Worker class KeyStorageLinux;
17*635a8641SAndroid Build Coastguard Worker 
18*635a8641SAndroid Build Coastguard Worker namespace android_webview {
19*635a8641SAndroid Build Coastguard Worker class AwFormDatabaseService;
20*635a8641SAndroid Build Coastguard Worker class CookieManager;
21*635a8641SAndroid Build Coastguard Worker class ScopedAllowInitGLBindings;
22*635a8641SAndroid Build Coastguard Worker }
23*635a8641SAndroid Build Coastguard Worker 
24*635a8641SAndroid Build Coastguard Worker namespace cc {
25*635a8641SAndroid Build Coastguard Worker class CompletionEvent;
26*635a8641SAndroid Build Coastguard Worker class SingleThreadTaskGraphRunner;
27*635a8641SAndroid Build Coastguard Worker }
28*635a8641SAndroid Build Coastguard Worker namespace chromeos {
29*635a8641SAndroid Build Coastguard Worker class BlockingMethodCaller;
30*635a8641SAndroid Build Coastguard Worker namespace system {
31*635a8641SAndroid Build Coastguard Worker class StatisticsProviderImpl;
32*635a8641SAndroid Build Coastguard Worker }
33*635a8641SAndroid Build Coastguard Worker }
34*635a8641SAndroid Build Coastguard Worker namespace chrome_browser_net {
35*635a8641SAndroid Build Coastguard Worker class Predictor;
36*635a8641SAndroid Build Coastguard Worker }
37*635a8641SAndroid Build Coastguard Worker namespace content {
38*635a8641SAndroid Build Coastguard Worker class BrowserGpuChannelHostFactory;
39*635a8641SAndroid Build Coastguard Worker class BrowserGpuMemoryBufferManager;
40*635a8641SAndroid Build Coastguard Worker class BrowserMainLoop;
41*635a8641SAndroid Build Coastguard Worker class BrowserProcessSubThread;
42*635a8641SAndroid Build Coastguard Worker class BrowserShutdownProfileDumper;
43*635a8641SAndroid Build Coastguard Worker class BrowserTestBase;
44*635a8641SAndroid Build Coastguard Worker class CategorizedWorkerPool;
45*635a8641SAndroid Build Coastguard Worker class GpuProcessTransportFactory;
46*635a8641SAndroid Build Coastguard Worker class NestedMessagePumpAndroid;
47*635a8641SAndroid Build Coastguard Worker class ScopedAllowWaitForAndroidLayoutTests;
48*635a8641SAndroid Build Coastguard Worker class ScopedAllowWaitForDebugURL;
49*635a8641SAndroid Build Coastguard Worker class SessionStorageDatabase;
50*635a8641SAndroid Build Coastguard Worker class SoftwareOutputDeviceMus;
51*635a8641SAndroid Build Coastguard Worker class ServiceWorkerSubresourceLoader;
52*635a8641SAndroid Build Coastguard Worker class SynchronousCompositor;
53*635a8641SAndroid Build Coastguard Worker class SynchronousCompositorHost;
54*635a8641SAndroid Build Coastguard Worker class SynchronousCompositorSyncCallBridge;
55*635a8641SAndroid Build Coastguard Worker class TextInputClientMac;
56*635a8641SAndroid Build Coastguard Worker }  // namespace content
57*635a8641SAndroid Build Coastguard Worker namespace cronet {
58*635a8641SAndroid Build Coastguard Worker class CronetPrefsManager;
59*635a8641SAndroid Build Coastguard Worker class CronetURLRequestContext;
60*635a8641SAndroid Build Coastguard Worker }  // namespace cronet
61*635a8641SAndroid Build Coastguard Worker namespace dbus {
62*635a8641SAndroid Build Coastguard Worker class Bus;
63*635a8641SAndroid Build Coastguard Worker }
64*635a8641SAndroid Build Coastguard Worker namespace disk_cache {
65*635a8641SAndroid Build Coastguard Worker class BackendImpl;
66*635a8641SAndroid Build Coastguard Worker class InFlightIO;
67*635a8641SAndroid Build Coastguard Worker }
68*635a8641SAndroid Build Coastguard Worker namespace functions {
69*635a8641SAndroid Build Coastguard Worker class ExecScriptScopedAllowBaseSyncPrimitives;
70*635a8641SAndroid Build Coastguard Worker }
71*635a8641SAndroid Build Coastguard Worker namespace gpu {
72*635a8641SAndroid Build Coastguard Worker class GpuChannelHost;
73*635a8641SAndroid Build Coastguard Worker }
74*635a8641SAndroid Build Coastguard Worker namespace leveldb {
75*635a8641SAndroid Build Coastguard Worker class LevelDBMojoProxy;
76*635a8641SAndroid Build Coastguard Worker }
77*635a8641SAndroid Build Coastguard Worker namespace media {
78*635a8641SAndroid Build Coastguard Worker class AudioInputDevice;
79*635a8641SAndroid Build Coastguard Worker class BlockingUrlProtocol;
80*635a8641SAndroid Build Coastguard Worker }
81*635a8641SAndroid Build Coastguard Worker namespace midi {
82*635a8641SAndroid Build Coastguard Worker class TaskService;  // https://crbug.com/796830
83*635a8641SAndroid Build Coastguard Worker }
84*635a8641SAndroid Build Coastguard Worker namespace mojo {
85*635a8641SAndroid Build Coastguard Worker class CoreLibraryInitializer;
86*635a8641SAndroid Build Coastguard Worker class SyncCallRestrictions;
87*635a8641SAndroid Build Coastguard Worker namespace core {
88*635a8641SAndroid Build Coastguard Worker class ScopedIPCSupport;
89*635a8641SAndroid Build Coastguard Worker }
90*635a8641SAndroid Build Coastguard Worker }
91*635a8641SAndroid Build Coastguard Worker namespace rlz_lib {
92*635a8641SAndroid Build Coastguard Worker class FinancialPing;
93*635a8641SAndroid Build Coastguard Worker }
94*635a8641SAndroid Build Coastguard Worker namespace ui {
95*635a8641SAndroid Build Coastguard Worker class CommandBufferClientImpl;
96*635a8641SAndroid Build Coastguard Worker class CommandBufferLocal;
97*635a8641SAndroid Build Coastguard Worker class GpuState;
98*635a8641SAndroid Build Coastguard Worker class MaterialDesignController;
99*635a8641SAndroid Build Coastguard Worker }
100*635a8641SAndroid Build Coastguard Worker namespace net {
101*635a8641SAndroid Build Coastguard Worker class MultiThreadedCertVerifierScopedAllowBaseSyncPrimitives;
102*635a8641SAndroid Build Coastguard Worker class NetworkChangeNotifierMac;
103*635a8641SAndroid Build Coastguard Worker namespace internal {
104*635a8641SAndroid Build Coastguard Worker class AddressTrackerLinux;
105*635a8641SAndroid Build Coastguard Worker }
106*635a8641SAndroid Build Coastguard Worker }
107*635a8641SAndroid Build Coastguard Worker 
108*635a8641SAndroid Build Coastguard Worker namespace remoting {
109*635a8641SAndroid Build Coastguard Worker class AutoThread;
110*635a8641SAndroid Build Coastguard Worker }
111*635a8641SAndroid Build Coastguard Worker 
112*635a8641SAndroid Build Coastguard Worker namespace resource_coordinator {
113*635a8641SAndroid Build Coastguard Worker class TabManagerDelegate;
114*635a8641SAndroid Build Coastguard Worker }
115*635a8641SAndroid Build Coastguard Worker 
116*635a8641SAndroid Build Coastguard Worker namespace service_manager {
117*635a8641SAndroid Build Coastguard Worker class ServiceProcessLauncher;
118*635a8641SAndroid Build Coastguard Worker }
119*635a8641SAndroid Build Coastguard Worker 
120*635a8641SAndroid Build Coastguard Worker namespace shell_integration {
121*635a8641SAndroid Build Coastguard Worker class LaunchXdgUtilityScopedAllowBaseSyncPrimitives;
122*635a8641SAndroid Build Coastguard Worker }
123*635a8641SAndroid Build Coastguard Worker 
124*635a8641SAndroid Build Coastguard Worker namespace ui {
125*635a8641SAndroid Build Coastguard Worker class WindowResizeHelperMac;
126*635a8641SAndroid Build Coastguard Worker }
127*635a8641SAndroid Build Coastguard Worker 
128*635a8641SAndroid Build Coastguard Worker namespace views {
129*635a8641SAndroid Build Coastguard Worker class ScreenMus;
130*635a8641SAndroid Build Coastguard Worker }
131*635a8641SAndroid Build Coastguard Worker 
132*635a8641SAndroid Build Coastguard Worker namespace viz {
133*635a8641SAndroid Build Coastguard Worker class HostGpuMemoryBufferManager;
134*635a8641SAndroid Build Coastguard Worker }
135*635a8641SAndroid Build Coastguard Worker 
136*635a8641SAndroid Build Coastguard Worker namespace webrtc {
137*635a8641SAndroid Build Coastguard Worker class DesktopConfigurationMonitor;
138*635a8641SAndroid Build Coastguard Worker }
139*635a8641SAndroid Build Coastguard Worker 
140*635a8641SAndroid Build Coastguard Worker namespace base {
141*635a8641SAndroid Build Coastguard Worker 
142*635a8641SAndroid Build Coastguard Worker namespace android {
143*635a8641SAndroid Build Coastguard Worker class JavaHandlerThread;
144*635a8641SAndroid Build Coastguard Worker }
145*635a8641SAndroid Build Coastguard Worker 
146*635a8641SAndroid Build Coastguard Worker namespace internal {
147*635a8641SAndroid Build Coastguard Worker class TaskTracker;
148*635a8641SAndroid Build Coastguard Worker }
149*635a8641SAndroid Build Coastguard Worker 
150*635a8641SAndroid Build Coastguard Worker class GetAppOutputScopedAllowBaseSyncPrimitives;
151*635a8641SAndroid Build Coastguard Worker class SimpleThread;
152*635a8641SAndroid Build Coastguard Worker class StackSamplingProfiler;
153*635a8641SAndroid Build Coastguard Worker class Thread;
154*635a8641SAndroid Build Coastguard Worker class ThreadTestHelper;
155*635a8641SAndroid Build Coastguard Worker 
156*635a8641SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
157*635a8641SAndroid Build Coastguard Worker #define INLINE_IF_DCHECK_IS_OFF BASE_EXPORT
158*635a8641SAndroid Build Coastguard Worker #define EMPTY_BODY_IF_DCHECK_IS_OFF
159*635a8641SAndroid Build Coastguard Worker #else
160*635a8641SAndroid Build Coastguard Worker #define INLINE_IF_DCHECK_IS_OFF inline
161*635a8641SAndroid Build Coastguard Worker #define EMPTY_BODY_IF_DCHECK_IS_OFF \
162*635a8641SAndroid Build Coastguard Worker   {}
163*635a8641SAndroid Build Coastguard Worker #endif
164*635a8641SAndroid Build Coastguard Worker 
165*635a8641SAndroid Build Coastguard Worker // A "blocking call" refers to any call that causes the calling thread to wait
166*635a8641SAndroid Build Coastguard Worker // off-CPU. It includes but is not limited to calls that wait on synchronous
167*635a8641SAndroid Build Coastguard Worker // file I/O operations: read or write a file from disk, interact with a pipe or
168*635a8641SAndroid Build Coastguard Worker // a socket, rename or delete a file, enumerate files in a directory, etc.
169*635a8641SAndroid Build Coastguard Worker // Acquiring a low contention lock is not considered a blocking call.
170*635a8641SAndroid Build Coastguard Worker 
171*635a8641SAndroid Build Coastguard Worker // Asserts that blocking calls are allowed in the current scope.
172*635a8641SAndroid Build Coastguard Worker //
173*635a8641SAndroid Build Coastguard Worker // Style tip: It's best if you put AssertBlockingAllowed() checks as close to
174*635a8641SAndroid Build Coastguard Worker // the blocking call as possible. For example:
175*635a8641SAndroid Build Coastguard Worker //
176*635a8641SAndroid Build Coastguard Worker // void ReadFile() {
177*635a8641SAndroid Build Coastguard Worker //   PreWork();
178*635a8641SAndroid Build Coastguard Worker //
179*635a8641SAndroid Build Coastguard Worker //   base::AssertBlockingAllowed();
180*635a8641SAndroid Build Coastguard Worker //   fopen(...);
181*635a8641SAndroid Build Coastguard Worker //
182*635a8641SAndroid Build Coastguard Worker //   PostWork();
183*635a8641SAndroid Build Coastguard Worker // }
184*635a8641SAndroid Build Coastguard Worker //
185*635a8641SAndroid Build Coastguard Worker // void Bar() {
186*635a8641SAndroid Build Coastguard Worker //   ReadFile();
187*635a8641SAndroid Build Coastguard Worker // }
188*635a8641SAndroid Build Coastguard Worker //
189*635a8641SAndroid Build Coastguard Worker // void Foo() {
190*635a8641SAndroid Build Coastguard Worker //   Bar();
191*635a8641SAndroid Build Coastguard Worker // }
192*635a8641SAndroid Build Coastguard Worker INLINE_IF_DCHECK_IS_OFF void AssertBlockingAllowed()
193*635a8641SAndroid Build Coastguard Worker     EMPTY_BODY_IF_DCHECK_IS_OFF;
194*635a8641SAndroid Build Coastguard Worker 
195*635a8641SAndroid Build Coastguard Worker // Disallows blocking on the current thread.
196*635a8641SAndroid Build Coastguard Worker INLINE_IF_DCHECK_IS_OFF void DisallowBlocking() EMPTY_BODY_IF_DCHECK_IS_OFF;
197*635a8641SAndroid Build Coastguard Worker 
198*635a8641SAndroid Build Coastguard Worker // Disallows blocking calls within its scope.
199*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT ScopedDisallowBlocking {
200*635a8641SAndroid Build Coastguard Worker  public:
201*635a8641SAndroid Build Coastguard Worker   ScopedDisallowBlocking() EMPTY_BODY_IF_DCHECK_IS_OFF;
202*635a8641SAndroid Build Coastguard Worker   ~ScopedDisallowBlocking() EMPTY_BODY_IF_DCHECK_IS_OFF;
203*635a8641SAndroid Build Coastguard Worker 
204*635a8641SAndroid Build Coastguard Worker  private:
205*635a8641SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
206*635a8641SAndroid Build Coastguard Worker   const bool was_disallowed_;
207*635a8641SAndroid Build Coastguard Worker #endif
208*635a8641SAndroid Build Coastguard Worker 
209*635a8641SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(ScopedDisallowBlocking);
210*635a8641SAndroid Build Coastguard Worker };
211*635a8641SAndroid Build Coastguard Worker 
212*635a8641SAndroid Build Coastguard Worker // ScopedAllowBlocking(ForTesting) allow blocking calls within a scope where
213*635a8641SAndroid Build Coastguard Worker // they are normally disallowed.
214*635a8641SAndroid Build Coastguard Worker //
215*635a8641SAndroid Build Coastguard Worker // Avoid using this. Prefer making blocking calls from tasks posted to
216*635a8641SAndroid Build Coastguard Worker // base::TaskScheduler with base::MayBlock().
217*635a8641SAndroid Build Coastguard Worker //
218*635a8641SAndroid Build Coastguard Worker // Where unavoidable, put ScopedAllow* instances in the narrowest scope possible
219*635a8641SAndroid Build Coastguard Worker // in the caller making the blocking call but no further down. That is: if a
220*635a8641SAndroid Build Coastguard Worker // Cleanup() method needs to do a blocking call, document Cleanup() as blocking
221*635a8641SAndroid Build Coastguard Worker // and add a ScopedAllowBlocking instance in callers that can't avoid making
222*635a8641SAndroid Build Coastguard Worker // this call from a context where blocking is banned, as such:
223*635a8641SAndroid Build Coastguard Worker //   void Client::MyMethod() {
224*635a8641SAndroid Build Coastguard Worker //     (...)
225*635a8641SAndroid Build Coastguard Worker //     {
226*635a8641SAndroid Build Coastguard Worker //       // Blocking is okay here because XYZ.
227*635a8641SAndroid Build Coastguard Worker //       ScopedAllowBlocking allow_blocking;
228*635a8641SAndroid Build Coastguard Worker //       my_foo_->Cleanup();
229*635a8641SAndroid Build Coastguard Worker //     }
230*635a8641SAndroid Build Coastguard Worker //     (...)
231*635a8641SAndroid Build Coastguard Worker //   }
232*635a8641SAndroid Build Coastguard Worker //
233*635a8641SAndroid Build Coastguard Worker //   // This method can block.
234*635a8641SAndroid Build Coastguard Worker //   void Foo::Cleanup() {
235*635a8641SAndroid Build Coastguard Worker //     // Do NOT add the ScopedAllowBlocking in Cleanup() directly as that hides
236*635a8641SAndroid Build Coastguard Worker //     // its blocking nature from unknowing callers and defeats the purpose of
237*635a8641SAndroid Build Coastguard Worker //     // these checks.
238*635a8641SAndroid Build Coastguard Worker //     FlushStateToDisk();
239*635a8641SAndroid Build Coastguard Worker //   }
240*635a8641SAndroid Build Coastguard Worker //
241*635a8641SAndroid Build Coastguard Worker // Note: In rare situations where the blocking call is an implementation detail
242*635a8641SAndroid Build Coastguard Worker // (i.e. the impl makes a call that invokes AssertBlockingAllowed() but it
243*635a8641SAndroid Build Coastguard Worker // somehow knows that in practice this will not block), it might be okay to hide
244*635a8641SAndroid Build Coastguard Worker // the ScopedAllowBlocking instance in the impl with a comment explaining why
245*635a8641SAndroid Build Coastguard Worker // that's okay.
246*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT ScopedAllowBlocking {
247*635a8641SAndroid Build Coastguard Worker  private:
248*635a8641SAndroid Build Coastguard Worker   // This can only be instantiated by friends. Use ScopedAllowBlockingForTesting
249*635a8641SAndroid Build Coastguard Worker   // in unit tests to avoid the friend requirement.
250*635a8641SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(ThreadRestrictionsTest, ScopedAllowBlocking);
251*635a8641SAndroid Build Coastguard Worker   friend class android_webview::ScopedAllowInitGLBindings;
252*635a8641SAndroid Build Coastguard Worker   friend class content::BrowserProcessSubThread;
253*635a8641SAndroid Build Coastguard Worker   friend class content::GpuProcessTransportFactory;
254*635a8641SAndroid Build Coastguard Worker   friend class cronet::CronetPrefsManager;
255*635a8641SAndroid Build Coastguard Worker   friend class cronet::CronetURLRequestContext;
256*635a8641SAndroid Build Coastguard Worker   friend class media::AudioInputDevice;
257*635a8641SAndroid Build Coastguard Worker   friend class mojo::CoreLibraryInitializer;
258*635a8641SAndroid Build Coastguard Worker   friend class resource_coordinator::TabManagerDelegate;  // crbug.com/778703
259*635a8641SAndroid Build Coastguard Worker   friend class ui::MaterialDesignController;
260*635a8641SAndroid Build Coastguard Worker   friend class ScopedAllowBlockingForTesting;
261*635a8641SAndroid Build Coastguard Worker   friend class StackSamplingProfiler;
262*635a8641SAndroid Build Coastguard Worker 
263*635a8641SAndroid Build Coastguard Worker   ScopedAllowBlocking() EMPTY_BODY_IF_DCHECK_IS_OFF;
264*635a8641SAndroid Build Coastguard Worker   ~ScopedAllowBlocking() EMPTY_BODY_IF_DCHECK_IS_OFF;
265*635a8641SAndroid Build Coastguard Worker 
266*635a8641SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
267*635a8641SAndroid Build Coastguard Worker   const bool was_disallowed_;
268*635a8641SAndroid Build Coastguard Worker #endif
269*635a8641SAndroid Build Coastguard Worker 
270*635a8641SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(ScopedAllowBlocking);
271*635a8641SAndroid Build Coastguard Worker };
272*635a8641SAndroid Build Coastguard Worker 
273*635a8641SAndroid Build Coastguard Worker class ScopedAllowBlockingForTesting {
274*635a8641SAndroid Build Coastguard Worker  public:
ScopedAllowBlockingForTesting()275*635a8641SAndroid Build Coastguard Worker   ScopedAllowBlockingForTesting() {}
~ScopedAllowBlockingForTesting()276*635a8641SAndroid Build Coastguard Worker   ~ScopedAllowBlockingForTesting() {}
277*635a8641SAndroid Build Coastguard Worker 
278*635a8641SAndroid Build Coastguard Worker  private:
279*635a8641SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
280*635a8641SAndroid Build Coastguard Worker   ScopedAllowBlocking scoped_allow_blocking_;
281*635a8641SAndroid Build Coastguard Worker #endif
282*635a8641SAndroid Build Coastguard Worker 
283*635a8641SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(ScopedAllowBlockingForTesting);
284*635a8641SAndroid Build Coastguard Worker };
285*635a8641SAndroid Build Coastguard Worker 
286*635a8641SAndroid Build Coastguard Worker // "Waiting on a //base sync primitive" refers to calling one of these methods:
287*635a8641SAndroid Build Coastguard Worker // - base::WaitableEvent::*Wait*
288*635a8641SAndroid Build Coastguard Worker // - base::ConditionVariable::*Wait*
289*635a8641SAndroid Build Coastguard Worker // - base::Process::WaitForExit*
290*635a8641SAndroid Build Coastguard Worker 
291*635a8641SAndroid Build Coastguard Worker // Disallows waiting on a //base sync primitive on the current thread.
292*635a8641SAndroid Build Coastguard Worker INLINE_IF_DCHECK_IS_OFF void DisallowBaseSyncPrimitives()
293*635a8641SAndroid Build Coastguard Worker     EMPTY_BODY_IF_DCHECK_IS_OFF;
294*635a8641SAndroid Build Coastguard Worker 
295*635a8641SAndroid Build Coastguard Worker // ScopedAllowBaseSyncPrimitives(ForTesting)(OutsideBlockingScope) allow waiting
296*635a8641SAndroid Build Coastguard Worker // on a //base sync primitive within a scope where this is normally disallowed.
297*635a8641SAndroid Build Coastguard Worker //
298*635a8641SAndroid Build Coastguard Worker // Avoid using this.
299*635a8641SAndroid Build Coastguard Worker //
300*635a8641SAndroid Build Coastguard Worker // Instead of waiting on a WaitableEvent or a ConditionVariable, put the work
301*635a8641SAndroid Build Coastguard Worker // that should happen after the wait in a callback and post that callback from
302*635a8641SAndroid Build Coastguard Worker // where the WaitableEvent or ConditionVariable would have been signaled. If
303*635a8641SAndroid Build Coastguard Worker // something needs to be scheduled after many tasks have executed, use
304*635a8641SAndroid Build Coastguard Worker // base::BarrierClosure.
305*635a8641SAndroid Build Coastguard Worker //
306*635a8641SAndroid Build Coastguard Worker // On Windows, join processes asynchronously using base::win::ObjectWatcher.
307*635a8641SAndroid Build Coastguard Worker 
308*635a8641SAndroid Build Coastguard Worker // This can only be used in a scope where blocking is allowed.
309*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT ScopedAllowBaseSyncPrimitives {
310*635a8641SAndroid Build Coastguard Worker  private:
311*635a8641SAndroid Build Coastguard Worker   // This can only be instantiated by friends. Use
312*635a8641SAndroid Build Coastguard Worker   // ScopedAllowBaseSyncPrimitivesForTesting in unit tests to avoid the friend
313*635a8641SAndroid Build Coastguard Worker   // requirement.
314*635a8641SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(ThreadRestrictionsTest,
315*635a8641SAndroid Build Coastguard Worker                            ScopedAllowBaseSyncPrimitives);
316*635a8641SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(ThreadRestrictionsTest,
317*635a8641SAndroid Build Coastguard Worker                            ScopedAllowBaseSyncPrimitivesResetsState);
318*635a8641SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(ThreadRestrictionsTest,
319*635a8641SAndroid Build Coastguard Worker                            ScopedAllowBaseSyncPrimitivesWithBlockingDisallowed);
320*635a8641SAndroid Build Coastguard Worker   friend class base::GetAppOutputScopedAllowBaseSyncPrimitives;
321*635a8641SAndroid Build Coastguard Worker   friend class content::BrowserProcessSubThread;
322*635a8641SAndroid Build Coastguard Worker   friend class content::SessionStorageDatabase;
323*635a8641SAndroid Build Coastguard Worker   friend class functions::ExecScriptScopedAllowBaseSyncPrimitives;
324*635a8641SAndroid Build Coastguard Worker   friend class leveldb::LevelDBMojoProxy;
325*635a8641SAndroid Build Coastguard Worker   friend class media::BlockingUrlProtocol;
326*635a8641SAndroid Build Coastguard Worker   friend class mojo::core::ScopedIPCSupport;
327*635a8641SAndroid Build Coastguard Worker   friend class net::MultiThreadedCertVerifierScopedAllowBaseSyncPrimitives;
328*635a8641SAndroid Build Coastguard Worker   friend class rlz_lib::FinancialPing;
329*635a8641SAndroid Build Coastguard Worker   friend class shell_integration::LaunchXdgUtilityScopedAllowBaseSyncPrimitives;
330*635a8641SAndroid Build Coastguard Worker   friend class webrtc::DesktopConfigurationMonitor;
331*635a8641SAndroid Build Coastguard Worker   friend class content::ServiceWorkerSubresourceLoader;
332*635a8641SAndroid Build Coastguard Worker   friend class viz::HostGpuMemoryBufferManager;
333*635a8641SAndroid Build Coastguard Worker 
334*635a8641SAndroid Build Coastguard Worker   ScopedAllowBaseSyncPrimitives() EMPTY_BODY_IF_DCHECK_IS_OFF;
335*635a8641SAndroid Build Coastguard Worker   ~ScopedAllowBaseSyncPrimitives() EMPTY_BODY_IF_DCHECK_IS_OFF;
336*635a8641SAndroid Build Coastguard Worker 
337*635a8641SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
338*635a8641SAndroid Build Coastguard Worker   const bool was_disallowed_;
339*635a8641SAndroid Build Coastguard Worker #endif
340*635a8641SAndroid Build Coastguard Worker 
341*635a8641SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(ScopedAllowBaseSyncPrimitives);
342*635a8641SAndroid Build Coastguard Worker };
343*635a8641SAndroid Build Coastguard Worker 
344*635a8641SAndroid Build Coastguard Worker // This can be used in a scope where blocking is disallowed.
345*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT ScopedAllowBaseSyncPrimitivesOutsideBlockingScope {
346*635a8641SAndroid Build Coastguard Worker  private:
347*635a8641SAndroid Build Coastguard Worker   // This can only be instantiated by friends. Use
348*635a8641SAndroid Build Coastguard Worker   // ScopedAllowBaseSyncPrimitivesForTesting in unit tests to avoid the friend
349*635a8641SAndroid Build Coastguard Worker   // requirement.
350*635a8641SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(ThreadRestrictionsTest,
351*635a8641SAndroid Build Coastguard Worker                            ScopedAllowBaseSyncPrimitivesOutsideBlockingScope);
352*635a8641SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(
353*635a8641SAndroid Build Coastguard Worker       ThreadRestrictionsTest,
354*635a8641SAndroid Build Coastguard Worker       ScopedAllowBaseSyncPrimitivesOutsideBlockingScopeResetsState);
355*635a8641SAndroid Build Coastguard Worker   friend class ::KeyStorageLinux;
356*635a8641SAndroid Build Coastguard Worker   friend class content::SynchronousCompositor;
357*635a8641SAndroid Build Coastguard Worker   friend class content::SynchronousCompositorHost;
358*635a8641SAndroid Build Coastguard Worker   friend class content::SynchronousCompositorSyncCallBridge;
359*635a8641SAndroid Build Coastguard Worker   friend class midi::TaskService;  // https://crbug.com/796830
360*635a8641SAndroid Build Coastguard Worker   // Not used in production yet, https://crbug.com/844078.
361*635a8641SAndroid Build Coastguard Worker   friend class service_manager::ServiceProcessLauncher;
362*635a8641SAndroid Build Coastguard Worker 
363*635a8641SAndroid Build Coastguard Worker   ScopedAllowBaseSyncPrimitivesOutsideBlockingScope()
364*635a8641SAndroid Build Coastguard Worker       EMPTY_BODY_IF_DCHECK_IS_OFF;
365*635a8641SAndroid Build Coastguard Worker   ~ScopedAllowBaseSyncPrimitivesOutsideBlockingScope()
366*635a8641SAndroid Build Coastguard Worker       EMPTY_BODY_IF_DCHECK_IS_OFF;
367*635a8641SAndroid Build Coastguard Worker 
368*635a8641SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
369*635a8641SAndroid Build Coastguard Worker   const bool was_disallowed_;
370*635a8641SAndroid Build Coastguard Worker #endif
371*635a8641SAndroid Build Coastguard Worker 
372*635a8641SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(ScopedAllowBaseSyncPrimitivesOutsideBlockingScope);
373*635a8641SAndroid Build Coastguard Worker };
374*635a8641SAndroid Build Coastguard Worker 
375*635a8641SAndroid Build Coastguard Worker // This can be used in tests without being a friend of
376*635a8641SAndroid Build Coastguard Worker // ScopedAllowBaseSyncPrimitives(OutsideBlockingScope).
377*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT ScopedAllowBaseSyncPrimitivesForTesting {
378*635a8641SAndroid Build Coastguard Worker  public:
379*635a8641SAndroid Build Coastguard Worker   ScopedAllowBaseSyncPrimitivesForTesting() EMPTY_BODY_IF_DCHECK_IS_OFF;
380*635a8641SAndroid Build Coastguard Worker   ~ScopedAllowBaseSyncPrimitivesForTesting() EMPTY_BODY_IF_DCHECK_IS_OFF;
381*635a8641SAndroid Build Coastguard Worker 
382*635a8641SAndroid Build Coastguard Worker  private:
383*635a8641SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
384*635a8641SAndroid Build Coastguard Worker   const bool was_disallowed_;
385*635a8641SAndroid Build Coastguard Worker #endif
386*635a8641SAndroid Build Coastguard Worker 
387*635a8641SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(ScopedAllowBaseSyncPrimitivesForTesting);
388*635a8641SAndroid Build Coastguard Worker };
389*635a8641SAndroid Build Coastguard Worker 
390*635a8641SAndroid Build Coastguard Worker namespace internal {
391*635a8641SAndroid Build Coastguard Worker 
392*635a8641SAndroid Build Coastguard Worker // Asserts that waiting on a //base sync primitive is allowed in the current
393*635a8641SAndroid Build Coastguard Worker // scope.
394*635a8641SAndroid Build Coastguard Worker INLINE_IF_DCHECK_IS_OFF void AssertBaseSyncPrimitivesAllowed()
395*635a8641SAndroid Build Coastguard Worker     EMPTY_BODY_IF_DCHECK_IS_OFF;
396*635a8641SAndroid Build Coastguard Worker 
397*635a8641SAndroid Build Coastguard Worker // Resets all thread restrictions on the current thread.
398*635a8641SAndroid Build Coastguard Worker INLINE_IF_DCHECK_IS_OFF void ResetThreadRestrictionsForTesting()
399*635a8641SAndroid Build Coastguard Worker     EMPTY_BODY_IF_DCHECK_IS_OFF;
400*635a8641SAndroid Build Coastguard Worker 
401*635a8641SAndroid Build Coastguard Worker }  // namespace internal
402*635a8641SAndroid Build Coastguard Worker 
403*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT ThreadRestrictions {
404*635a8641SAndroid Build Coastguard Worker  public:
405*635a8641SAndroid Build Coastguard Worker   // Constructing a ScopedAllowIO temporarily allows IO for the current
406*635a8641SAndroid Build Coastguard Worker   // thread.  Doing this is almost certainly always incorrect.
407*635a8641SAndroid Build Coastguard Worker   //
408*635a8641SAndroid Build Coastguard Worker   // DEPRECATED. Use ScopedAllowBlocking(ForTesting).
409*635a8641SAndroid Build Coastguard Worker   class BASE_EXPORT ScopedAllowIO {
410*635a8641SAndroid Build Coastguard Worker    public:
411*635a8641SAndroid Build Coastguard Worker     ScopedAllowIO() EMPTY_BODY_IF_DCHECK_IS_OFF;
412*635a8641SAndroid Build Coastguard Worker     ~ScopedAllowIO() EMPTY_BODY_IF_DCHECK_IS_OFF;
413*635a8641SAndroid Build Coastguard Worker 
414*635a8641SAndroid Build Coastguard Worker    private:
415*635a8641SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
416*635a8641SAndroid Build Coastguard Worker     const bool was_allowed_;
417*635a8641SAndroid Build Coastguard Worker #endif
418*635a8641SAndroid Build Coastguard Worker 
419*635a8641SAndroid Build Coastguard Worker     DISALLOW_COPY_AND_ASSIGN(ScopedAllowIO);
420*635a8641SAndroid Build Coastguard Worker   };
421*635a8641SAndroid Build Coastguard Worker 
422*635a8641SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
423*635a8641SAndroid Build Coastguard Worker   // Set whether the current thread to make IO calls.
424*635a8641SAndroid Build Coastguard Worker   // Threads start out in the *allowed* state.
425*635a8641SAndroid Build Coastguard Worker   // Returns the previous value.
426*635a8641SAndroid Build Coastguard Worker   //
427*635a8641SAndroid Build Coastguard Worker   // DEPRECATED. Use ScopedAllowBlocking(ForTesting) or ScopedDisallowBlocking.
428*635a8641SAndroid Build Coastguard Worker   static bool SetIOAllowed(bool allowed);
429*635a8641SAndroid Build Coastguard Worker 
430*635a8641SAndroid Build Coastguard Worker   // Set whether the current thread can use singletons.  Returns the previous
431*635a8641SAndroid Build Coastguard Worker   // value.
432*635a8641SAndroid Build Coastguard Worker   static bool SetSingletonAllowed(bool allowed);
433*635a8641SAndroid Build Coastguard Worker 
434*635a8641SAndroid Build Coastguard Worker   // Check whether the current thread is allowed to use singletons (Singleton /
435*635a8641SAndroid Build Coastguard Worker   // LazyInstance).  DCHECKs if not.
436*635a8641SAndroid Build Coastguard Worker   static void AssertSingletonAllowed();
437*635a8641SAndroid Build Coastguard Worker 
438*635a8641SAndroid Build Coastguard Worker   // Disable waiting on the current thread. Threads start out in the *allowed*
439*635a8641SAndroid Build Coastguard Worker   // state. Returns the previous value.
440*635a8641SAndroid Build Coastguard Worker   //
441*635a8641SAndroid Build Coastguard Worker   // DEPRECATED. Use DisallowBaseSyncPrimitives.
442*635a8641SAndroid Build Coastguard Worker   static void DisallowWaiting();
443*635a8641SAndroid Build Coastguard Worker #else
444*635a8641SAndroid Build Coastguard Worker   // Inline the empty definitions of these functions so that they can be
445*635a8641SAndroid Build Coastguard Worker   // compiled out.
SetIOAllowed(bool allowed)446*635a8641SAndroid Build Coastguard Worker   static bool SetIOAllowed(bool allowed) { return true; }
SetSingletonAllowed(bool allowed)447*635a8641SAndroid Build Coastguard Worker   static bool SetSingletonAllowed(bool allowed) { return true; }
AssertSingletonAllowed()448*635a8641SAndroid Build Coastguard Worker   static void AssertSingletonAllowed() {}
DisallowWaiting()449*635a8641SAndroid Build Coastguard Worker   static void DisallowWaiting() {}
450*635a8641SAndroid Build Coastguard Worker #endif
451*635a8641SAndroid Build Coastguard Worker 
452*635a8641SAndroid Build Coastguard Worker  private:
453*635a8641SAndroid Build Coastguard Worker   // DO NOT ADD ANY OTHER FRIEND STATEMENTS.
454*635a8641SAndroid Build Coastguard Worker   // BEGIN ALLOWED USAGE.
455*635a8641SAndroid Build Coastguard Worker   friend class android_webview::AwFormDatabaseService;
456*635a8641SAndroid Build Coastguard Worker   friend class android_webview::CookieManager;
457*635a8641SAndroid Build Coastguard Worker   friend class base::StackSamplingProfiler;
458*635a8641SAndroid Build Coastguard Worker   friend class content::BrowserMainLoop;
459*635a8641SAndroid Build Coastguard Worker   friend class content::BrowserShutdownProfileDumper;
460*635a8641SAndroid Build Coastguard Worker   friend class content::BrowserTestBase;
461*635a8641SAndroid Build Coastguard Worker   friend class content::NestedMessagePumpAndroid;
462*635a8641SAndroid Build Coastguard Worker   friend class content::ScopedAllowWaitForAndroidLayoutTests;
463*635a8641SAndroid Build Coastguard Worker   friend class content::ScopedAllowWaitForDebugURL;
464*635a8641SAndroid Build Coastguard Worker   friend class ::HistogramSynchronizer;
465*635a8641SAndroid Build Coastguard Worker   friend class internal::TaskTracker;
466*635a8641SAndroid Build Coastguard Worker   friend class cc::CompletionEvent;
467*635a8641SAndroid Build Coastguard Worker   friend class cc::SingleThreadTaskGraphRunner;
468*635a8641SAndroid Build Coastguard Worker   friend class content::CategorizedWorkerPool;
469*635a8641SAndroid Build Coastguard Worker   friend class remoting::AutoThread;
470*635a8641SAndroid Build Coastguard Worker   friend class ui::WindowResizeHelperMac;
471*635a8641SAndroid Build Coastguard Worker   friend class MessagePumpDefault;
472*635a8641SAndroid Build Coastguard Worker   friend class SimpleThread;
473*635a8641SAndroid Build Coastguard Worker   friend class Thread;
474*635a8641SAndroid Build Coastguard Worker   friend class ThreadTestHelper;
475*635a8641SAndroid Build Coastguard Worker   friend class PlatformThread;
476*635a8641SAndroid Build Coastguard Worker   friend class android::JavaHandlerThread;
477*635a8641SAndroid Build Coastguard Worker   friend class mojo::SyncCallRestrictions;
478*635a8641SAndroid Build Coastguard Worker   friend class ui::CommandBufferClientImpl;
479*635a8641SAndroid Build Coastguard Worker   friend class ui::CommandBufferLocal;
480*635a8641SAndroid Build Coastguard Worker   friend class ui::GpuState;
481*635a8641SAndroid Build Coastguard Worker 
482*635a8641SAndroid Build Coastguard Worker   // END ALLOWED USAGE.
483*635a8641SAndroid Build Coastguard Worker   // BEGIN USAGE THAT NEEDS TO BE FIXED.
484*635a8641SAndroid Build Coastguard Worker   friend class ::chromeos::BlockingMethodCaller;  // http://crbug.com/125360
485*635a8641SAndroid Build Coastguard Worker   friend class ::chromeos::system::StatisticsProviderImpl;  // http://crbug.com/125385
486*635a8641SAndroid Build Coastguard Worker   friend class chrome_browser_net::Predictor;     // http://crbug.com/78451
487*635a8641SAndroid Build Coastguard Worker   friend class
488*635a8641SAndroid Build Coastguard Worker       content::BrowserGpuChannelHostFactory;      // http://crbug.com/125248
489*635a8641SAndroid Build Coastguard Worker   friend class
490*635a8641SAndroid Build Coastguard Worker       content::BrowserGpuMemoryBufferManager;     // http://crbug.com/420368
491*635a8641SAndroid Build Coastguard Worker   friend class content::TextInputClientMac;       // http://crbug.com/121917
492*635a8641SAndroid Build Coastguard Worker   friend class dbus::Bus;                         // http://crbug.com/125222
493*635a8641SAndroid Build Coastguard Worker   friend class disk_cache::BackendImpl;           // http://crbug.com/74623
494*635a8641SAndroid Build Coastguard Worker   friend class disk_cache::InFlightIO;            // http://crbug.com/74623
495*635a8641SAndroid Build Coastguard Worker   friend class gpu::GpuChannelHost;               // http://crbug.com/125264
496*635a8641SAndroid Build Coastguard Worker   friend class net::internal::AddressTrackerLinux;  // http://crbug.com/125097
497*635a8641SAndroid Build Coastguard Worker   friend class net::NetworkChangeNotifierMac;     // http://crbug.com/125097
498*635a8641SAndroid Build Coastguard Worker   friend class ::BrowserProcessImpl;              // http://crbug.com/125207
499*635a8641SAndroid Build Coastguard Worker   friend class ::NativeBackendKWallet;            // http://crbug.com/125331
500*635a8641SAndroid Build Coastguard Worker #if !defined(OFFICIAL_BUILD)
501*635a8641SAndroid Build Coastguard Worker   friend class content::SoftwareOutputDeviceMus;  // Interim non-production code
502*635a8641SAndroid Build Coastguard Worker #endif
503*635a8641SAndroid Build Coastguard Worker   friend class views::ScreenMus;
504*635a8641SAndroid Build Coastguard Worker // END USAGE THAT NEEDS TO BE FIXED.
505*635a8641SAndroid Build Coastguard Worker 
506*635a8641SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
507*635a8641SAndroid Build Coastguard Worker   // DEPRECATED. Use ScopedAllowBaseSyncPrimitives.
508*635a8641SAndroid Build Coastguard Worker   static bool SetWaitAllowed(bool allowed);
509*635a8641SAndroid Build Coastguard Worker #else
SetWaitAllowed(bool allowed)510*635a8641SAndroid Build Coastguard Worker   static bool SetWaitAllowed(bool allowed) { return true; }
511*635a8641SAndroid Build Coastguard Worker #endif
512*635a8641SAndroid Build Coastguard Worker 
513*635a8641SAndroid Build Coastguard Worker   // Constructing a ScopedAllowWait temporarily allows waiting on the current
514*635a8641SAndroid Build Coastguard Worker   // thread.  Doing this is almost always incorrect, which is why we limit who
515*635a8641SAndroid Build Coastguard Worker   // can use this through friend.
516*635a8641SAndroid Build Coastguard Worker   //
517*635a8641SAndroid Build Coastguard Worker   // DEPRECATED. Use ScopedAllowBaseSyncPrimitives.
518*635a8641SAndroid Build Coastguard Worker   class BASE_EXPORT ScopedAllowWait {
519*635a8641SAndroid Build Coastguard Worker    public:
520*635a8641SAndroid Build Coastguard Worker     ScopedAllowWait() EMPTY_BODY_IF_DCHECK_IS_OFF;
521*635a8641SAndroid Build Coastguard Worker     ~ScopedAllowWait() EMPTY_BODY_IF_DCHECK_IS_OFF;
522*635a8641SAndroid Build Coastguard Worker 
523*635a8641SAndroid Build Coastguard Worker    private:
524*635a8641SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
525*635a8641SAndroid Build Coastguard Worker     const bool was_allowed_;
526*635a8641SAndroid Build Coastguard Worker #endif
527*635a8641SAndroid Build Coastguard Worker 
528*635a8641SAndroid Build Coastguard Worker     DISALLOW_COPY_AND_ASSIGN(ScopedAllowWait);
529*635a8641SAndroid Build Coastguard Worker   };
530*635a8641SAndroid Build Coastguard Worker 
531*635a8641SAndroid Build Coastguard Worker   DISALLOW_IMPLICIT_CONSTRUCTORS(ThreadRestrictions);
532*635a8641SAndroid Build Coastguard Worker };
533*635a8641SAndroid Build Coastguard Worker 
534*635a8641SAndroid Build Coastguard Worker }  // namespace base
535*635a8641SAndroid Build Coastguard Worker 
536*635a8641SAndroid Build Coastguard Worker #endif  // BASE_THREADING_THREAD_RESTRICTIONS_H_
537