xref: /aosp_15_r20/external/cronet/base/threading/thread_restrictions.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_THREADING_THREAD_RESTRICTIONS_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_THREADING_THREAD_RESTRICTIONS_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include "base/auto_reset.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/compiler_specific.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/dcheck_is_on.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/gtest_prod_util.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/location.h"
14*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
17*6777b538SAndroid Build Coastguard Worker #include <optional>
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker #include "base/debug/stack_trace.h"
20*6777b538SAndroid Build Coastguard Worker #endif
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
23*6777b538SAndroid Build Coastguard Worker // Usage documentation
24*6777b538SAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
25*6777b538SAndroid Build Coastguard Worker //
26*6777b538SAndroid Build Coastguard Worker // Overview:
27*6777b538SAndroid Build Coastguard Worker // This file exposes functions to ban and allow certain slow operations
28*6777b538SAndroid Build Coastguard Worker // on a per-thread basis. To annotate *usage* of such slow operations, refer to
29*6777b538SAndroid Build Coastguard Worker // scoped_blocking_call.h instead.
30*6777b538SAndroid Build Coastguard Worker //
31*6777b538SAndroid Build Coastguard Worker // Specific allowances that can be controlled in this file are:
32*6777b538SAndroid Build Coastguard Worker //
33*6777b538SAndroid Build Coastguard Worker // - Blocking call: Refers to any call that causes the calling thread to wait
34*6777b538SAndroid Build Coastguard Worker //   off-CPU. It includes but is not limited to calls that wait on synchronous
35*6777b538SAndroid Build Coastguard Worker //   file I/O operations: read or write a file from disk, interact with a pipe
36*6777b538SAndroid Build Coastguard Worker //   or a socket, rename or delete a file, enumerate files in a directory, etc.
37*6777b538SAndroid Build Coastguard Worker //   Acquiring a low contention lock is not considered a blocking call.
38*6777b538SAndroid Build Coastguard Worker //
39*6777b538SAndroid Build Coastguard Worker //   Prefer to allow a blocking call by posting a task to
40*6777b538SAndroid Build Coastguard Worker //   base::ThreadPoolInstance with base::MayBlock().
41*6777b538SAndroid Build Coastguard Worker //
42*6777b538SAndroid Build Coastguard Worker // - Waiting on a //base sync primitive: Refers to calling one of these methods:
43*6777b538SAndroid Build Coastguard Worker //   - base::WaitableEvent::*Wait*
44*6777b538SAndroid Build Coastguard Worker //   - base::ConditionVariable::*Wait*
45*6777b538SAndroid Build Coastguard Worker //   - base::Process::WaitForExit*
46*6777b538SAndroid Build Coastguard Worker //
47*6777b538SAndroid Build Coastguard Worker //   Prefer not to wait on //base sync primitives (see below for alternatives).
48*6777b538SAndroid Build Coastguard Worker //   When it is unavoidable, use ScopedAllowBaseSyncPrimitives in a task posted
49*6777b538SAndroid Build Coastguard Worker //   to base::ThreadPoolInstance with base::MayBlock().
50*6777b538SAndroid Build Coastguard Worker //
51*6777b538SAndroid Build Coastguard Worker // - Accessing singletons: Accessing global state (Singleton / LazyInstance) is
52*6777b538SAndroid Build Coastguard Worker //   problematic on threads whom aren't joined on shutdown as they can be using
53*6777b538SAndroid Build Coastguard Worker //   the state as it becomes invalid during tear down. base::NoDestructor is the
54*6777b538SAndroid Build Coastguard Worker //   preferred alternative for global state and doesn't have this restriction.
55*6777b538SAndroid Build Coastguard Worker //
56*6777b538SAndroid Build Coastguard Worker // - Long CPU work: Refers to any code that takes more than 100 ms to
57*6777b538SAndroid Build Coastguard Worker //   run when there is no CPU contention and no hard page faults and therefore,
58*6777b538SAndroid Build Coastguard Worker //   is not suitable to run on a thread required to keep the browser responsive
59*6777b538SAndroid Build Coastguard Worker //   (where jank could be visible to the user).
60*6777b538SAndroid Build Coastguard Worker //
61*6777b538SAndroid Build Coastguard Worker // The following disallowance functions are offered:
62*6777b538SAndroid Build Coastguard Worker //  - DisallowBlocking(): Disallows blocking calls on the current thread.
63*6777b538SAndroid Build Coastguard Worker //  - DisallowBaseSyncPrimitives(): Disallows waiting on a //base sync primitive
64*6777b538SAndroid Build Coastguard Worker //    on the current thread.
65*6777b538SAndroid Build Coastguard Worker //  - DisallowSingleton(): Disallows using singletons on the current thread.
66*6777b538SAndroid Build Coastguard Worker //  - DisallowUnresponsiveTasks(): Disallows blocking calls, waiting on a //base
67*6777b538SAndroid Build Coastguard Worker //    sync primitive, and long CPU work on the current thread.
68*6777b538SAndroid Build Coastguard Worker //
69*6777b538SAndroid Build Coastguard Worker // In addition, scoped-allowance mechanisms are offered to make an exception
70*6777b538SAndroid Build Coastguard Worker // within a scope for a behavior that is normally disallowed.
71*6777b538SAndroid Build Coastguard Worker //  - ScopedAllowBlocking: Allows blocking calls. Prefer to use base::MayBlock()
72*6777b538SAndroid Build Coastguard Worker //    instead.
73*6777b538SAndroid Build Coastguard Worker //  - ScopedAllowBaseSyncPrimitives: Allows waiting on a //base sync primitive.
74*6777b538SAndroid Build Coastguard Worker //    Must also be in a scope where blocking calls are allowed.
75*6777b538SAndroid Build Coastguard Worker //  - ScopedAllowBaseSyncPrimitivesOutsideBlockingScope: Allow waiting on a
76*6777b538SAndroid Build Coastguard Worker //    //base sync primitive, even in a scope where blocking calls are
77*6777b538SAndroid Build Coastguard Worker //    disallowed. Prefer to use a combination of base::MayBlock() and
78*6777b538SAndroid Build Coastguard Worker //    ScopedAllowBaseSyncPrimitives.
79*6777b538SAndroid Build Coastguard Worker //
80*6777b538SAndroid Build Coastguard Worker // Avoid using allowances outside of unit tests. In unit tests, use allowances
81*6777b538SAndroid Build Coastguard Worker // with the suffix "ForTesting":
82*6777b538SAndroid Build Coastguard Worker //  - ScopedAllowBlockingForTesting: Allows blocking calls in unit tests.
83*6777b538SAndroid Build Coastguard Worker //  - ScopedAllowBaseSyncPrimitivesForTesting: Allows waiting on a //base sync
84*6777b538SAndroid Build Coastguard Worker //    primitive in unit tests. For convenience this can be used in a scope
85*6777b538SAndroid Build Coastguard Worker //    where blocking calls are disallowed. Note that base::TestWaitableEvent can
86*6777b538SAndroid Build Coastguard Worker //    be used without this, also for convenience.
87*6777b538SAndroid Build Coastguard Worker //
88*6777b538SAndroid Build Coastguard Worker // Prefer making blocking calls from tasks posted to base::ThreadPoolInstance
89*6777b538SAndroid Build Coastguard Worker // with base::MayBlock().
90*6777b538SAndroid Build Coastguard Worker //
91*6777b538SAndroid Build Coastguard Worker // Instead of waiting on a WaitableEvent or a ConditionVariable, prefer putting
92*6777b538SAndroid Build Coastguard Worker // the work that should happen after the wait in a continuation callback and
93*6777b538SAndroid Build Coastguard Worker // post it from where the WaitableEvent or ConditionVariable would have been
94*6777b538SAndroid Build Coastguard Worker // signaled. If something needs to be scheduled after many tasks have executed,
95*6777b538SAndroid Build Coastguard Worker // use base::BarrierClosure.
96*6777b538SAndroid Build Coastguard Worker //
97*6777b538SAndroid Build Coastguard Worker // On Windows, join processes asynchronously using base::win::ObjectWatcher.
98*6777b538SAndroid Build Coastguard Worker //
99*6777b538SAndroid Build Coastguard Worker // Where unavoidable, put ScopedAllow* instances in the narrowest scope possible
100*6777b538SAndroid Build Coastguard Worker // in the caller making the blocking call but no further down. For example: if a
101*6777b538SAndroid Build Coastguard Worker // Cleanup() method needs to do a blocking call, document Cleanup() as blocking
102*6777b538SAndroid Build Coastguard Worker // and add a ScopedAllowBlocking instance in callers that can't avoid making
103*6777b538SAndroid Build Coastguard Worker // this call from a context where blocking is banned, as such:
104*6777b538SAndroid Build Coastguard Worker //
105*6777b538SAndroid Build Coastguard Worker //   void Client::MyMethod() {
106*6777b538SAndroid Build Coastguard Worker //     (...)
107*6777b538SAndroid Build Coastguard Worker //     {
108*6777b538SAndroid Build Coastguard Worker //       // Blocking is okay here because XYZ.
109*6777b538SAndroid Build Coastguard Worker //       ScopedAllowBlocking allow_blocking;
110*6777b538SAndroid Build Coastguard Worker //       my_foo_->Cleanup();
111*6777b538SAndroid Build Coastguard Worker //     }
112*6777b538SAndroid Build Coastguard Worker //     (...)
113*6777b538SAndroid Build Coastguard Worker //   }
114*6777b538SAndroid Build Coastguard Worker //
115*6777b538SAndroid Build Coastguard Worker //   // This method can block.
116*6777b538SAndroid Build Coastguard Worker //   void Foo::Cleanup() {
117*6777b538SAndroid Build Coastguard Worker //     // Do NOT add the ScopedAllowBlocking in Cleanup() directly as that hides
118*6777b538SAndroid Build Coastguard Worker //     // its blocking nature from unknowing callers and defeats the purpose of
119*6777b538SAndroid Build Coastguard Worker //     // these checks.
120*6777b538SAndroid Build Coastguard Worker //     FlushStateToDisk();
121*6777b538SAndroid Build Coastguard Worker //   }
122*6777b538SAndroid Build Coastguard Worker //
123*6777b538SAndroid Build Coastguard Worker // Note: In rare situations where the blocking call is an implementation detail
124*6777b538SAndroid Build Coastguard Worker // (i.e. the impl makes a call that invokes AssertBlockingAllowed() but it
125*6777b538SAndroid Build Coastguard Worker // somehow knows that in practice this will not block), it might be okay to hide
126*6777b538SAndroid Build Coastguard Worker // the ScopedAllowBlocking instance in the impl with a comment explaining why
127*6777b538SAndroid Build Coastguard Worker // that's okay.
128*6777b538SAndroid Build Coastguard Worker 
129*6777b538SAndroid Build Coastguard Worker class BrowserProcessImpl;
130*6777b538SAndroid Build Coastguard Worker class BrowserThemePack;
131*6777b538SAndroid Build Coastguard Worker class ChromeNSSCryptoModuleDelegate;
132*6777b538SAndroid Build Coastguard Worker class DesktopNotificationBalloon;
133*6777b538SAndroid Build Coastguard Worker class FirefoxProfileLock;
134*6777b538SAndroid Build Coastguard Worker class GaiaConfig;
135*6777b538SAndroid Build Coastguard Worker class KeyStorageLinux;
136*6777b538SAndroid Build Coastguard Worker class NativeBackendKWallet;
137*6777b538SAndroid Build Coastguard Worker class NativeDesktopMediaList;
138*6777b538SAndroid Build Coastguard Worker class PartnerBookmarksReader;
139*6777b538SAndroid Build Coastguard Worker class Profile;
140*6777b538SAndroid Build Coastguard Worker class ProfileImpl;
141*6777b538SAndroid Build Coastguard Worker class ScopedAllowBlockingForProfile;
142*6777b538SAndroid Build Coastguard Worker class StartupTabProviderImpl;
143*6777b538SAndroid Build Coastguard Worker class WebEngineBrowserMainParts;
144*6777b538SAndroid Build Coastguard Worker 
145*6777b538SAndroid Build Coastguard Worker namespace base {
146*6777b538SAndroid Build Coastguard Worker class Environment;
147*6777b538SAndroid Build Coastguard Worker class File;
148*6777b538SAndroid Build Coastguard Worker class FilePath;
149*6777b538SAndroid Build Coastguard Worker namespace sequence_manager::internal {
150*6777b538SAndroid Build Coastguard Worker class WorkTracker;
151*6777b538SAndroid Build Coastguard Worker }  // namespace sequence_manager::internal
152*6777b538SAndroid Build Coastguard Worker }  // namespace base
153*6777b538SAndroid Build Coastguard Worker 
154*6777b538SAndroid Build Coastguard Worker bool EnsureBrowserStateDirectoriesCreated(const base::FilePath&,
155*6777b538SAndroid Build Coastguard Worker                                           const base::FilePath&,
156*6777b538SAndroid Build Coastguard Worker                                           const base::FilePath&);
157*6777b538SAndroid Build Coastguard Worker Profile* GetLastProfileMac();
158*6777b538SAndroid Build Coastguard Worker bool HasWaylandDisplay(base::Environment* env);
159*6777b538SAndroid Build Coastguard Worker 
160*6777b538SAndroid Build Coastguard Worker namespace android_webview {
161*6777b538SAndroid Build Coastguard Worker class AwBrowserContext;
162*6777b538SAndroid Build Coastguard Worker class AwFormDatabaseService;
163*6777b538SAndroid Build Coastguard Worker class CookieManager;
164*6777b538SAndroid Build Coastguard Worker class JsSandboxIsolate;
165*6777b538SAndroid Build Coastguard Worker class ScopedAllowInitGLBindings;
166*6777b538SAndroid Build Coastguard Worker class VizCompositorThreadRunnerWebView;
167*6777b538SAndroid Build Coastguard Worker }  // namespace android_webview
168*6777b538SAndroid Build Coastguard Worker namespace ash {
169*6777b538SAndroid Build Coastguard Worker class BrowserDataBackMigrator;
170*6777b538SAndroid Build Coastguard Worker class LoginEventRecorder;
171*6777b538SAndroid Build Coastguard Worker class StartupCustomizationDocument;
172*6777b538SAndroid Build Coastguard Worker class StartupUtils;
173*6777b538SAndroid Build Coastguard Worker bool CameraAppUIShouldEnableLocalOverride(const std::string&);
174*6777b538SAndroid Build Coastguard Worker namespace converters::diagnostics {
175*6777b538SAndroid Build Coastguard Worker class MojoUtils;
176*6777b538SAndroid Build Coastguard Worker }
177*6777b538SAndroid Build Coastguard Worker namespace system {
178*6777b538SAndroid Build Coastguard Worker class StatisticsProviderImpl;
179*6777b538SAndroid Build Coastguard Worker class ProcStatFile;
180*6777b538SAndroid Build Coastguard Worker }  // namespace system
181*6777b538SAndroid Build Coastguard Worker }  // namespace ash
182*6777b538SAndroid Build Coastguard Worker namespace audio {
183*6777b538SAndroid Build Coastguard Worker class OutputDevice;
184*6777b538SAndroid Build Coastguard Worker }
185*6777b538SAndroid Build Coastguard Worker namespace blink {
186*6777b538SAndroid Build Coastguard Worker class AudioDestination;
187*6777b538SAndroid Build Coastguard Worker class DiskDataAllocator;
188*6777b538SAndroid Build Coastguard Worker class RTCVideoDecoderAdapter;
189*6777b538SAndroid Build Coastguard Worker class RTCVideoEncoder;
190*6777b538SAndroid Build Coastguard Worker class SourceStream;
191*6777b538SAndroid Build Coastguard Worker class VideoFrameResourceProvider;
192*6777b538SAndroid Build Coastguard Worker class WebRtcVideoFrameAdapter;
193*6777b538SAndroid Build Coastguard Worker class VideoTrackRecorderImplContextProvider;
194*6777b538SAndroid Build Coastguard Worker class WorkerThread;
195*6777b538SAndroid Build Coastguard Worker namespace scheduler {
196*6777b538SAndroid Build Coastguard Worker class NonMainThreadImpl;
197*6777b538SAndroid Build Coastguard Worker }
198*6777b538SAndroid Build Coastguard Worker }  // namespace blink
199*6777b538SAndroid Build Coastguard Worker namespace cc {
200*6777b538SAndroid Build Coastguard Worker class CategorizedWorkerPoolImpl;
201*6777b538SAndroid Build Coastguard Worker class CategorizedWorkerPoolJob;
202*6777b538SAndroid Build Coastguard Worker class CategorizedWorkerPool;
203*6777b538SAndroid Build Coastguard Worker class CompletionEvent;
204*6777b538SAndroid Build Coastguard Worker class TileTaskManagerImpl;
205*6777b538SAndroid Build Coastguard Worker }  // namespace cc
206*6777b538SAndroid Build Coastguard Worker namespace chrome {
207*6777b538SAndroid Build Coastguard Worker bool PathProvider(int, base::FilePath*);
208*6777b538SAndroid Build Coastguard Worker void SessionEnding();
209*6777b538SAndroid Build Coastguard Worker }  // namespace chrome
210*6777b538SAndroid Build Coastguard Worker namespace chromecast {
211*6777b538SAndroid Build Coastguard Worker class CrashUtil;
212*6777b538SAndroid Build Coastguard Worker }
213*6777b538SAndroid Build Coastguard Worker namespace chromeos {
214*6777b538SAndroid Build Coastguard Worker class BlockingMethodCaller;
215*6777b538SAndroid Build Coastguard Worker namespace system {
216*6777b538SAndroid Build Coastguard Worker bool IsCoreSchedulingAvailable();
217*6777b538SAndroid Build Coastguard Worker int NumberOfPhysicalCores();
218*6777b538SAndroid Build Coastguard Worker }  // namespace system
219*6777b538SAndroid Build Coastguard Worker }  // namespace chromeos
220*6777b538SAndroid Build Coastguard Worker namespace content {
221*6777b538SAndroid Build Coastguard Worker class BrowserGpuChannelHostFactory;
222*6777b538SAndroid Build Coastguard Worker class BrowserMainLoop;
223*6777b538SAndroid Build Coastguard Worker class BrowserProcessIOThread;
224*6777b538SAndroid Build Coastguard Worker class BrowserTestBase;
225*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_IOS)
226*6777b538SAndroid Build Coastguard Worker class ContentMainRunnerImpl;
227*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_IOS)
228*6777b538SAndroid Build Coastguard Worker class DesktopCaptureDevice;
229*6777b538SAndroid Build Coastguard Worker class DWriteFontCollectionProxy;
230*6777b538SAndroid Build Coastguard Worker class DWriteFontProxyImpl;
231*6777b538SAndroid Build Coastguard Worker class EmergencyTraceFinalisationCoordinator;
232*6777b538SAndroid Build Coastguard Worker class InProcessUtilityThread;
233*6777b538SAndroid Build Coastguard Worker class NestedMessagePumpAndroid;
234*6777b538SAndroid Build Coastguard Worker class NetworkServiceInstancePrivate;
235*6777b538SAndroid Build Coastguard Worker class PepperPrintSettingsManagerImpl;
236*6777b538SAndroid Build Coastguard Worker class RenderProcessHostImpl;
237*6777b538SAndroid Build Coastguard Worker class RenderProcessHost;
238*6777b538SAndroid Build Coastguard Worker class RenderWidgetHostViewMac;
239*6777b538SAndroid Build Coastguard Worker class RendererBlinkPlatformImpl;
240*6777b538SAndroid Build Coastguard Worker class SandboxHostLinux;
241*6777b538SAndroid Build Coastguard Worker class ScopedAllowWaitForDebugURL;
242*6777b538SAndroid Build Coastguard Worker class ServiceWorkerContextClient;
243*6777b538SAndroid Build Coastguard Worker class ShellPathProvider;
244*6777b538SAndroid Build Coastguard Worker class SynchronousCompositor;
245*6777b538SAndroid Build Coastguard Worker class SynchronousCompositorHost;
246*6777b538SAndroid Build Coastguard Worker class SynchronousCompositorSyncCallBridge;
247*6777b538SAndroid Build Coastguard Worker class ScopedAllowBlockingForViewAura;
248*6777b538SAndroid Build Coastguard Worker class TextInputClientMac;
249*6777b538SAndroid Build Coastguard Worker class WebContentsImpl;
250*6777b538SAndroid Build Coastguard Worker class WebContentsViewMac;
251*6777b538SAndroid Build Coastguard Worker base::File CreateFileForDrop(base::FilePath*);
252*6777b538SAndroid Build Coastguard Worker }  // namespace content
253*6777b538SAndroid Build Coastguard Worker namespace cronet {
254*6777b538SAndroid Build Coastguard Worker class CronetPrefsManager;
255*6777b538SAndroid Build Coastguard Worker class CronetContext;
256*6777b538SAndroid Build Coastguard Worker }  // namespace cronet
257*6777b538SAndroid Build Coastguard Worker namespace crosapi {
258*6777b538SAndroid Build Coastguard Worker class LacrosThreadTypeDelegate;
259*6777b538SAndroid Build Coastguard Worker }  // namespace crosapi
260*6777b538SAndroid Build Coastguard Worker namespace crypto {
261*6777b538SAndroid Build Coastguard Worker class ScopedAllowBlockingForNSS;
262*6777b538SAndroid Build Coastguard Worker }
263*6777b538SAndroid Build Coastguard Worker namespace dbus {
264*6777b538SAndroid Build Coastguard Worker class Bus;
265*6777b538SAndroid Build Coastguard Worker }
266*6777b538SAndroid Build Coastguard Worker namespace drive {
267*6777b538SAndroid Build Coastguard Worker class FakeDriveService;
268*6777b538SAndroid Build Coastguard Worker }
269*6777b538SAndroid Build Coastguard Worker namespace device {
270*6777b538SAndroid Build Coastguard Worker class UsbContext;
271*6777b538SAndroid Build Coastguard Worker }
272*6777b538SAndroid Build Coastguard Worker namespace discardable_memory {
273*6777b538SAndroid Build Coastguard Worker class ClientDiscardableSharedMemoryManager;
274*6777b538SAndroid Build Coastguard Worker }
275*6777b538SAndroid Build Coastguard Worker namespace disk_cache {
276*6777b538SAndroid Build Coastguard Worker class BackendImpl;
277*6777b538SAndroid Build Coastguard Worker class InFlightIO;
278*6777b538SAndroid Build Coastguard Worker bool CleanupDirectorySync(const base::FilePath&);
279*6777b538SAndroid Build Coastguard Worker }  // namespace disk_cache
280*6777b538SAndroid Build Coastguard Worker namespace enterprise_connectors {
281*6777b538SAndroid Build Coastguard Worker class LinuxKeyRotationCommand;
282*6777b538SAndroid Build Coastguard Worker }  // namespace enterprise_connectors
283*6777b538SAndroid Build Coastguard Worker namespace extensions {
284*6777b538SAndroid Build Coastguard Worker class InstalledLoader;
285*6777b538SAndroid Build Coastguard Worker class UnpackedInstaller;
286*6777b538SAndroid Build Coastguard Worker }  // namespace extensions
287*6777b538SAndroid Build Coastguard Worker namespace font_service::internal {
288*6777b538SAndroid Build Coastguard Worker class MappedFontFile;
289*6777b538SAndroid Build Coastguard Worker }
290*6777b538SAndroid Build Coastguard Worker namespace gl {
291*6777b538SAndroid Build Coastguard Worker struct GLImplementationParts;
292*6777b538SAndroid Build Coastguard Worker namespace init {
293*6777b538SAndroid Build Coastguard Worker bool InitializeStaticGLBindings(GLImplementationParts);
294*6777b538SAndroid Build Coastguard Worker }
295*6777b538SAndroid Build Coastguard Worker }  // namespace gl
296*6777b538SAndroid Build Coastguard Worker namespace history_report {
297*6777b538SAndroid Build Coastguard Worker class HistoryReportJniBridge;
298*6777b538SAndroid Build Coastguard Worker }
299*6777b538SAndroid Build Coastguard Worker namespace ios_web_view {
300*6777b538SAndroid Build Coastguard Worker class WebViewBrowserState;
301*6777b538SAndroid Build Coastguard Worker }
302*6777b538SAndroid Build Coastguard Worker namespace io_thread {
303*6777b538SAndroid Build Coastguard Worker class IOSIOThread;
304*6777b538SAndroid Build Coastguard Worker }
305*6777b538SAndroid Build Coastguard Worker namespace leveldb::port {
306*6777b538SAndroid Build Coastguard Worker class CondVar;
307*6777b538SAndroid Build Coastguard Worker }  // namespace leveldb::port
308*6777b538SAndroid Build Coastguard Worker namespace nearby::chrome {
309*6777b538SAndroid Build Coastguard Worker class ScheduledExecutor;
310*6777b538SAndroid Build Coastguard Worker class SubmittableExecutor;
311*6777b538SAndroid Build Coastguard Worker }  // namespace nearby::chrome
312*6777b538SAndroid Build Coastguard Worker namespace media {
313*6777b538SAndroid Build Coastguard Worker class AudioInputDevice;
314*6777b538SAndroid Build Coastguard Worker class AudioOutputDevice;
315*6777b538SAndroid Build Coastguard Worker class BlockingUrlProtocol;
316*6777b538SAndroid Build Coastguard Worker template <class WorkerInterface,
317*6777b538SAndroid Build Coastguard Worker           class WorkerImpl,
318*6777b538SAndroid Build Coastguard Worker           class Worker,
319*6777b538SAndroid Build Coastguard Worker           class WorkerStatus,
320*6777b538SAndroid Build Coastguard Worker           WorkerStatus StatusNotOk,
321*6777b538SAndroid Build Coastguard Worker           WorkerStatus StatusOk,
322*6777b538SAndroid Build Coastguard Worker           WorkerStatus StatusWork>
323*6777b538SAndroid Build Coastguard Worker class CodecWorkerImpl;
324*6777b538SAndroid Build Coastguard Worker class FileVideoCaptureDeviceFactory;
325*6777b538SAndroid Build Coastguard Worker class MojoVideoEncodeAccelerator;
326*6777b538SAndroid Build Coastguard Worker class PaintCanvasVideoRenderer;
327*6777b538SAndroid Build Coastguard Worker class V4L2DevicePoller;  // TODO(1513721): remove this.
328*6777b538SAndroid Build Coastguard Worker }  // namespace media
329*6777b538SAndroid Build Coastguard Worker namespace memory_instrumentation {
330*6777b538SAndroid Build Coastguard Worker class OSMetrics;
331*6777b538SAndroid Build Coastguard Worker }
332*6777b538SAndroid Build Coastguard Worker namespace memory_pressure {
333*6777b538SAndroid Build Coastguard Worker class UserLevelMemoryPressureSignalGenerator;
334*6777b538SAndroid Build Coastguard Worker }
335*6777b538SAndroid Build Coastguard Worker namespace metrics {
336*6777b538SAndroid Build Coastguard Worker class AndroidMetricsServiceClient;
337*6777b538SAndroid Build Coastguard Worker class CleanExitBeacon;
338*6777b538SAndroid Build Coastguard Worker }  // namespace metrics
339*6777b538SAndroid Build Coastguard Worker namespace midi {
340*6777b538SAndroid Build Coastguard Worker class TaskService;  // https://crbug.com/796830
341*6777b538SAndroid Build Coastguard Worker }
342*6777b538SAndroid Build Coastguard Worker namespace module_installer {
343*6777b538SAndroid Build Coastguard Worker class ScopedAllowModulePakLoad;
344*6777b538SAndroid Build Coastguard Worker }
345*6777b538SAndroid Build Coastguard Worker namespace mojo {
346*6777b538SAndroid Build Coastguard Worker class CoreLibraryInitializer;
347*6777b538SAndroid Build Coastguard Worker class SyncCallRestrictions;
348*6777b538SAndroid Build Coastguard Worker namespace core {
349*6777b538SAndroid Build Coastguard Worker class ScopedIPCSupport;
350*6777b538SAndroid Build Coastguard Worker namespace ipcz_driver {
351*6777b538SAndroid Build Coastguard Worker class MojoTrap;
352*6777b538SAndroid Build Coastguard Worker }
353*6777b538SAndroid Build Coastguard Worker }  // namespace core
354*6777b538SAndroid Build Coastguard Worker }  // namespace mojo
355*6777b538SAndroid Build Coastguard Worker namespace net {
356*6777b538SAndroid Build Coastguard Worker class GSSAPISharedLibrary;
357*6777b538SAndroid Build Coastguard Worker class MultiThreadedCertVerifierScopedAllowBaseSyncPrimitives;
358*6777b538SAndroid Build Coastguard Worker class MultiThreadedProxyResolverScopedAllowJoinOnIO;
359*6777b538SAndroid Build Coastguard Worker class NetworkChangeNotifierApple;
360*6777b538SAndroid Build Coastguard Worker class NetworkConfigWatcherAppleThread;
361*6777b538SAndroid Build Coastguard Worker class ProxyConfigServiceWin;
362*6777b538SAndroid Build Coastguard Worker class ScopedAllowBlockingForSettingGetter;
363*6777b538SAndroid Build Coastguard Worker namespace internal {
364*6777b538SAndroid Build Coastguard Worker class AddressTrackerLinux;
365*6777b538SAndroid Build Coastguard Worker class PemFileCertStore;
366*6777b538SAndroid Build Coastguard Worker }
367*6777b538SAndroid Build Coastguard Worker }  // namespace net
368*6777b538SAndroid Build Coastguard Worker namespace printing {
369*6777b538SAndroid Build Coastguard Worker class LocalPrinterHandlerDefault;
370*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_MAC)
371*6777b538SAndroid Build Coastguard Worker class PrintBackendServiceImpl;
372*6777b538SAndroid Build Coastguard Worker #endif
373*6777b538SAndroid Build Coastguard Worker class PrintBackendServiceManager;
374*6777b538SAndroid Build Coastguard Worker class PrintPreviewUIUntrusted;
375*6777b538SAndroid Build Coastguard Worker class PrinterQuery;
376*6777b538SAndroid Build Coastguard Worker }  // namespace printing
377*6777b538SAndroid Build Coastguard Worker namespace proxy_resolver {
378*6777b538SAndroid Build Coastguard Worker class ScopedAllowThreadJoinForProxyResolverV8Tracing;
379*6777b538SAndroid Build Coastguard Worker }
380*6777b538SAndroid Build Coastguard Worker namespace remote_cocoa {
381*6777b538SAndroid Build Coastguard Worker class DroppedScreenShotCopierMac;
382*6777b538SAndroid Build Coastguard Worker class SelectFileDialogBridge;
383*6777b538SAndroid Build Coastguard Worker }  // namespace remote_cocoa
384*6777b538SAndroid Build Coastguard Worker namespace remoting {
385*6777b538SAndroid Build Coastguard Worker class AutoThread;
386*6777b538SAndroid Build Coastguard Worker class ScopedAllowBlockingForCrashReporting;
387*6777b538SAndroid Build Coastguard Worker class ScopedBypassIOThreadRestrictions;
388*6777b538SAndroid Build Coastguard Worker namespace protocol {
389*6777b538SAndroid Build Coastguard Worker class ScopedAllowSyncPrimitivesForWebRtcDataStreamAdapter;
390*6777b538SAndroid Build Coastguard Worker class ScopedAllowSyncPrimitivesForWebRtcTransport;
391*6777b538SAndroid Build Coastguard Worker class ScopedAllowSyncPrimitivesForWebRtcVideoStream;
392*6777b538SAndroid Build Coastguard Worker class ScopedAllowThreadJoinForWebRtcTransport;
393*6777b538SAndroid Build Coastguard Worker }  // namespace protocol
394*6777b538SAndroid Build Coastguard Worker }  // namespace remoting
395*6777b538SAndroid Build Coastguard Worker namespace rlz_lib {
396*6777b538SAndroid Build Coastguard Worker class FinancialPing;
397*6777b538SAndroid Build Coastguard Worker }
398*6777b538SAndroid Build Coastguard Worker namespace service_manager {
399*6777b538SAndroid Build Coastguard Worker class ServiceProcessLauncher;
400*6777b538SAndroid Build Coastguard Worker }
401*6777b538SAndroid Build Coastguard Worker namespace shell_integration_linux {
402*6777b538SAndroid Build Coastguard Worker class LaunchXdgUtilityScopedAllowBaseSyncPrimitives;
403*6777b538SAndroid Build Coastguard Worker }
404*6777b538SAndroid Build Coastguard Worker namespace storage {
405*6777b538SAndroid Build Coastguard Worker class ObfuscatedFileUtil;
406*6777b538SAndroid Build Coastguard Worker }
407*6777b538SAndroid Build Coastguard Worker namespace syncer {
408*6777b538SAndroid Build Coastguard Worker class GetLocalChangesRequest;
409*6777b538SAndroid Build Coastguard Worker class HttpBridge;
410*6777b538SAndroid Build Coastguard Worker }  // namespace syncer
411*6777b538SAndroid Build Coastguard Worker namespace tracing {
412*6777b538SAndroid Build Coastguard Worker class FuchsiaPerfettoProducerConnector;
413*6777b538SAndroid Build Coastguard Worker }
414*6777b538SAndroid Build Coastguard Worker namespace ui {
415*6777b538SAndroid Build Coastguard Worker class DrmThreadProxy;
416*6777b538SAndroid Build Coastguard Worker class DrmDisplayHostManager;
417*6777b538SAndroid Build Coastguard Worker class ScopedAllowBlockingForGbmSurface;
418*6777b538SAndroid Build Coastguard Worker class SelectFileDialogLinux;
419*6777b538SAndroid Build Coastguard Worker class WindowResizeHelperMac;
420*6777b538SAndroid Build Coastguard Worker }  // namespace ui
421*6777b538SAndroid Build Coastguard Worker namespace updater {
422*6777b538SAndroid Build Coastguard Worker class SystemctlLauncherScopedAllowBaseSyncPrimitives;
423*6777b538SAndroid Build Coastguard Worker }
424*6777b538SAndroid Build Coastguard Worker namespace viz {
425*6777b538SAndroid Build Coastguard Worker class HostGpuMemoryBufferManager;
426*6777b538SAndroid Build Coastguard Worker class ClientGpuMemoryBufferManager;
427*6777b538SAndroid Build Coastguard Worker }  // namespace viz
428*6777b538SAndroid Build Coastguard Worker namespace vr {
429*6777b538SAndroid Build Coastguard Worker class VrShell;
430*6777b538SAndroid Build Coastguard Worker }
431*6777b538SAndroid Build Coastguard Worker namespace web {
432*6777b538SAndroid Build Coastguard Worker class WebMainLoop;
433*6777b538SAndroid Build Coastguard Worker }  // namespace web
434*6777b538SAndroid Build Coastguard Worker namespace weblayer {
435*6777b538SAndroid Build Coastguard Worker class BrowserContextImpl;
436*6777b538SAndroid Build Coastguard Worker class ContentBrowserClientImpl;
437*6777b538SAndroid Build Coastguard Worker class ProfileImpl;
438*6777b538SAndroid Build Coastguard Worker class WebLayerPathProvider;
439*6777b538SAndroid Build Coastguard Worker }  // namespace weblayer
440*6777b538SAndroid Build Coastguard Worker // NOTE: Please do not append entries here. Put them in the list above and keep
441*6777b538SAndroid Build Coastguard Worker // the list sorted.
442*6777b538SAndroid Build Coastguard Worker 
443*6777b538SAndroid Build Coastguard Worker namespace base {
444*6777b538SAndroid Build Coastguard Worker 
445*6777b538SAndroid Build Coastguard Worker namespace android {
446*6777b538SAndroid Build Coastguard Worker class JavaHandlerThread;
447*6777b538SAndroid Build Coastguard Worker class PmfUtils;
448*6777b538SAndroid Build Coastguard Worker class ScopedAllowBlockingForImportantFileWriter;
449*6777b538SAndroid Build Coastguard Worker }  // namespace android
450*6777b538SAndroid Build Coastguard Worker 
451*6777b538SAndroid Build Coastguard Worker namespace apple::internal {
452*6777b538SAndroid Build Coastguard Worker base::FilePath GetExecutablePath();
453*6777b538SAndroid Build Coastguard Worker }
454*6777b538SAndroid Build Coastguard Worker 
455*6777b538SAndroid Build Coastguard Worker namespace debug {
456*6777b538SAndroid Build Coastguard Worker class StackTrace;
457*6777b538SAndroid Build Coastguard Worker }
458*6777b538SAndroid Build Coastguard Worker 
459*6777b538SAndroid Build Coastguard Worker namespace internal {
460*6777b538SAndroid Build Coastguard Worker class GetAppOutputScopedAllowBaseSyncPrimitives;
461*6777b538SAndroid Build Coastguard Worker class JobTaskSource;
462*6777b538SAndroid Build Coastguard Worker class TaskTracker;
463*6777b538SAndroid Build Coastguard Worker bool ReadProcFile(const FilePath& file, std::string* buffer);
464*6777b538SAndroid Build Coastguard Worker }  // namespace internal
465*6777b538SAndroid Build Coastguard Worker 
466*6777b538SAndroid Build Coastguard Worker namespace sequence_manager::internal {
467*6777b538SAndroid Build Coastguard Worker class TaskQueueImpl;
468*6777b538SAndroid Build Coastguard Worker }  // namespace sequence_manager::internal
469*6777b538SAndroid Build Coastguard Worker 
470*6777b538SAndroid Build Coastguard Worker namespace subtle {
471*6777b538SAndroid Build Coastguard Worker class PlatformSharedMemoryRegion;
472*6777b538SAndroid Build Coastguard Worker }
473*6777b538SAndroid Build Coastguard Worker 
474*6777b538SAndroid Build Coastguard Worker namespace win {
475*6777b538SAndroid Build Coastguard Worker class OSInfo;
476*6777b538SAndroid Build Coastguard Worker class ObjectWatcher;
477*6777b538SAndroid Build Coastguard Worker class ScopedAllowBlockingForUserAccountControl;
478*6777b538SAndroid Build Coastguard Worker }  // namespace win
479*6777b538SAndroid Build Coastguard Worker 
480*6777b538SAndroid Build Coastguard Worker class AdjustOOMScoreHelper;
481*6777b538SAndroid Build Coastguard Worker class ChromeOSVersionInfo;
482*6777b538SAndroid Build Coastguard Worker class FileDescriptorWatcher;
483*6777b538SAndroid Build Coastguard Worker class FilePath;
484*6777b538SAndroid Build Coastguard Worker class Process;
485*6777b538SAndroid Build Coastguard Worker class ScopedAllowBlockingForProc;
486*6777b538SAndroid Build Coastguard Worker class ScopedAllowBlockingForProcessMetrics;
487*6777b538SAndroid Build Coastguard Worker class ScopedAllowThreadRecallForStackSamplingProfiler;
488*6777b538SAndroid Build Coastguard Worker class SimpleThread;
489*6777b538SAndroid Build Coastguard Worker class StackSamplingProfiler;
490*6777b538SAndroid Build Coastguard Worker class TestCustomDisallow;
491*6777b538SAndroid Build Coastguard Worker class Thread;
492*6777b538SAndroid Build Coastguard Worker 
493*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
494*6777b538SAndroid Build Coastguard Worker // NOT_TAIL_CALLED if dcheck-is-on so it's always evident who irrevocably
495*6777b538SAndroid Build Coastguard Worker // altered the allowance (dcheck-builds will provide the setter's stack on
496*6777b538SAndroid Build Coastguard Worker // assertion) or who made a failing Assert*() call.
497*6777b538SAndroid Build Coastguard Worker #define INLINE_OR_NOT_TAIL_CALLED NOT_TAIL_CALLED BASE_EXPORT
498*6777b538SAndroid Build Coastguard Worker #define EMPTY_BODY_IF_DCHECK_IS_OFF
499*6777b538SAndroid Build Coastguard Worker #define DEFAULT_IF_DCHECK_IS_OFF
500*6777b538SAndroid Build Coastguard Worker 
501*6777b538SAndroid Build Coastguard Worker class BooleanWithStack {
502*6777b538SAndroid Build Coastguard Worker  public:
503*6777b538SAndroid Build Coastguard Worker   // Default value.
504*6777b538SAndroid Build Coastguard Worker   BooleanWithStack() = default;
505*6777b538SAndroid Build Coastguard Worker 
506*6777b538SAndroid Build Coastguard Worker   // Value when explicitly set.
507*6777b538SAndroid Build Coastguard Worker   explicit BooleanWithStack(bool value);
508*6777b538SAndroid Build Coastguard Worker 
509*6777b538SAndroid Build Coastguard Worker   explicit operator bool() const { return value_; }
510*6777b538SAndroid Build Coastguard Worker 
511*6777b538SAndroid Build Coastguard Worker   friend std::ostream& operator<<(std::ostream& out,
512*6777b538SAndroid Build Coastguard Worker                                   const BooleanWithStack& bws);
513*6777b538SAndroid Build Coastguard Worker 
514*6777b538SAndroid Build Coastguard Worker  private:
515*6777b538SAndroid Build Coastguard Worker   bool value_ = false;
516*6777b538SAndroid Build Coastguard Worker   std::optional<debug::StackTrace> stack_;
517*6777b538SAndroid Build Coastguard Worker };
518*6777b538SAndroid Build Coastguard Worker 
519*6777b538SAndroid Build Coastguard Worker #else
520*6777b538SAndroid Build Coastguard Worker // inline if dcheck-is-off so it's no overhead
521*6777b538SAndroid Build Coastguard Worker #define INLINE_OR_NOT_TAIL_CALLED inline
522*6777b538SAndroid Build Coastguard Worker 
523*6777b538SAndroid Build Coastguard Worker // The static_assert() eats follow-on semicolons.
524*6777b538SAndroid Build Coastguard Worker #define EMPTY_BODY_IF_DCHECK_IS_OFF \
525*6777b538SAndroid Build Coastguard Worker   {}                                \
526*6777b538SAndroid Build Coastguard Worker   static_assert(true)
527*6777b538SAndroid Build Coastguard Worker 
528*6777b538SAndroid Build Coastguard Worker #define DEFAULT_IF_DCHECK_IS_OFF = default
529*6777b538SAndroid Build Coastguard Worker #endif  // DCHECK_IS_ON()
530*6777b538SAndroid Build Coastguard Worker 
531*6777b538SAndroid Build Coastguard Worker namespace internal {
532*6777b538SAndroid Build Coastguard Worker 
533*6777b538SAndroid Build Coastguard Worker // Asserts that blocking calls are allowed in the current scope. This is an
534*6777b538SAndroid Build Coastguard Worker // internal call, external code should use ScopedBlockingCall instead, which
535*6777b538SAndroid Build Coastguard Worker // serves as a precise annotation of the scope that may/will block.
536*6777b538SAndroid Build Coastguard Worker INLINE_OR_NOT_TAIL_CALLED void AssertBlockingAllowed()
537*6777b538SAndroid Build Coastguard Worker     EMPTY_BODY_IF_DCHECK_IS_OFF;
538*6777b538SAndroid Build Coastguard Worker INLINE_OR_NOT_TAIL_CALLED void AssertBlockingDisallowedForTesting()
539*6777b538SAndroid Build Coastguard Worker     EMPTY_BODY_IF_DCHECK_IS_OFF;
540*6777b538SAndroid Build Coastguard Worker 
541*6777b538SAndroid Build Coastguard Worker }  // namespace internal
542*6777b538SAndroid Build Coastguard Worker 
543*6777b538SAndroid Build Coastguard Worker // Disallows blocking on the current thread.
544*6777b538SAndroid Build Coastguard Worker INLINE_OR_NOT_TAIL_CALLED void DisallowBlocking() EMPTY_BODY_IF_DCHECK_IS_OFF;
545*6777b538SAndroid Build Coastguard Worker 
546*6777b538SAndroid Build Coastguard Worker // Disallows blocking calls within its scope.
547*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT [[maybe_unused, nodiscard]] ScopedDisallowBlocking {
548*6777b538SAndroid Build Coastguard Worker  public:
549*6777b538SAndroid Build Coastguard Worker   ScopedDisallowBlocking() DEFAULT_IF_DCHECK_IS_OFF;
550*6777b538SAndroid Build Coastguard Worker 
551*6777b538SAndroid Build Coastguard Worker   ScopedDisallowBlocking(const ScopedDisallowBlocking&) = delete;
552*6777b538SAndroid Build Coastguard Worker   ScopedDisallowBlocking& operator=(const ScopedDisallowBlocking&) = delete;
553*6777b538SAndroid Build Coastguard Worker 
554*6777b538SAndroid Build Coastguard Worker   ~ScopedDisallowBlocking() DEFAULT_IF_DCHECK_IS_OFF;
555*6777b538SAndroid Build Coastguard Worker 
556*6777b538SAndroid Build Coastguard Worker  private:
557*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
558*6777b538SAndroid Build Coastguard Worker   const AutoReset<BooleanWithStack> resetter_;
559*6777b538SAndroid Build Coastguard Worker #endif
560*6777b538SAndroid Build Coastguard Worker };
561*6777b538SAndroid Build Coastguard Worker 
562*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT [[maybe_unused, nodiscard]] ScopedAllowBlocking {
563*6777b538SAndroid Build Coastguard Worker  public:
564*6777b538SAndroid Build Coastguard Worker   ScopedAllowBlocking(const ScopedAllowBlocking&) = delete;
565*6777b538SAndroid Build Coastguard Worker   ScopedAllowBlocking& operator=(const ScopedAllowBlocking&) = delete;
566*6777b538SAndroid Build Coastguard Worker 
567*6777b538SAndroid Build Coastguard Worker  private:
568*6777b538SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(ThreadRestrictionsTest,
569*6777b538SAndroid Build Coastguard Worker                            NestedAllowRestoresPreviousStack);
570*6777b538SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(ThreadRestrictionsTest, ScopedAllowBlocking);
571*6777b538SAndroid Build Coastguard Worker   friend class ScopedAllowBlockingForTesting;
572*6777b538SAndroid Build Coastguard Worker 
573*6777b538SAndroid Build Coastguard Worker   // This can only be instantiated by friends. Use ScopedAllowBlockingForTesting
574*6777b538SAndroid Build Coastguard Worker   // in unit tests to avoid the friend requirement.
575*6777b538SAndroid Build Coastguard Worker   // Sorted by class name (with namespace), #if blocks at the bottom.
576*6777b538SAndroid Build Coastguard Worker   friend class ::BrowserProcessImpl;
577*6777b538SAndroid Build Coastguard Worker   friend class ::BrowserThemePack;  // http://crbug.com/80206
578*6777b538SAndroid Build Coastguard Worker   friend class ::DesktopNotificationBalloon;
579*6777b538SAndroid Build Coastguard Worker   friend class ::FirefoxProfileLock;
580*6777b538SAndroid Build Coastguard Worker   friend class ::GaiaConfig;
581*6777b538SAndroid Build Coastguard Worker   friend class ::ProfileImpl;
582*6777b538SAndroid Build Coastguard Worker   friend class ::ScopedAllowBlockingForProfile;
583*6777b538SAndroid Build Coastguard Worker   friend class ::StartupTabProviderImpl;
584*6777b538SAndroid Build Coastguard Worker   friend class ::WebEngineBrowserMainParts;
585*6777b538SAndroid Build Coastguard Worker   friend class android_webview::AwBrowserContext;
586*6777b538SAndroid Build Coastguard Worker   friend class android_webview::ScopedAllowInitGLBindings;
587*6777b538SAndroid Build Coastguard Worker   friend class ash::BrowserDataBackMigrator;
588*6777b538SAndroid Build Coastguard Worker   friend class ash::LoginEventRecorder;
589*6777b538SAndroid Build Coastguard Worker   friend class ash::StartupCustomizationDocument;  // http://crosbug.com/11103
590*6777b538SAndroid Build Coastguard Worker   friend class ash::StartupUtils;
591*6777b538SAndroid Build Coastguard Worker   friend class ash::converters::diagnostics::MojoUtils;  // http://b/322741627
592*6777b538SAndroid Build Coastguard Worker   friend class ash::system::ProcStatFile;
593*6777b538SAndroid Build Coastguard Worker   friend class base::AdjustOOMScoreHelper;
594*6777b538SAndroid Build Coastguard Worker   friend class base::ChromeOSVersionInfo;
595*6777b538SAndroid Build Coastguard Worker   friend class base::Process;
596*6777b538SAndroid Build Coastguard Worker   friend class base::ScopedAllowBlockingForProc;
597*6777b538SAndroid Build Coastguard Worker   friend class base::ScopedAllowBlockingForProcessMetrics;
598*6777b538SAndroid Build Coastguard Worker   friend class base::StackSamplingProfiler;
599*6777b538SAndroid Build Coastguard Worker   friend class base::android::ScopedAllowBlockingForImportantFileWriter;
600*6777b538SAndroid Build Coastguard Worker   friend class base::android::PmfUtils;
601*6777b538SAndroid Build Coastguard Worker   friend class base::debug::StackTrace;
602*6777b538SAndroid Build Coastguard Worker   friend class base::subtle::PlatformSharedMemoryRegion;
603*6777b538SAndroid Build Coastguard Worker   friend class base::win::ScopedAllowBlockingForUserAccountControl;
604*6777b538SAndroid Build Coastguard Worker   friend class blink::DiskDataAllocator;
605*6777b538SAndroid Build Coastguard Worker   friend class chromecast::CrashUtil;
606*6777b538SAndroid Build Coastguard Worker   friend class content::BrowserProcessIOThread;
607*6777b538SAndroid Build Coastguard Worker   friend class content::DWriteFontProxyImpl;
608*6777b538SAndroid Build Coastguard Worker   friend class content::NetworkServiceInstancePrivate;
609*6777b538SAndroid Build Coastguard Worker   friend class content::PepperPrintSettingsManagerImpl;
610*6777b538SAndroid Build Coastguard Worker   friend class content::RenderProcessHostImpl;
611*6777b538SAndroid Build Coastguard Worker   friend class content::RenderWidgetHostViewMac;  // http://crbug.com/121917
612*6777b538SAndroid Build Coastguard Worker   friend class content::
613*6777b538SAndroid Build Coastguard Worker       ScopedAllowBlockingForViewAura;  // http://crbug.com/332579
614*6777b538SAndroid Build Coastguard Worker   friend class content::ShellPathProvider;
615*6777b538SAndroid Build Coastguard Worker   friend class content::WebContentsViewMac;
616*6777b538SAndroid Build Coastguard Worker   friend class cronet::CronetContext;
617*6777b538SAndroid Build Coastguard Worker   friend class cronet::CronetPrefsManager;
618*6777b538SAndroid Build Coastguard Worker   friend class crosapi::LacrosThreadTypeDelegate;
619*6777b538SAndroid Build Coastguard Worker   friend class crypto::ScopedAllowBlockingForNSS;  // http://crbug.com/59847
620*6777b538SAndroid Build Coastguard Worker   friend class drive::FakeDriveService;
621*6777b538SAndroid Build Coastguard Worker   friend class extensions::InstalledLoader;
622*6777b538SAndroid Build Coastguard Worker   friend class extensions::UnpackedInstaller;
623*6777b538SAndroid Build Coastguard Worker   friend class font_service::internal::MappedFontFile;
624*6777b538SAndroid Build Coastguard Worker   friend class ios_web_view::WebViewBrowserState;
625*6777b538SAndroid Build Coastguard Worker   friend class io_thread::IOSIOThread;
626*6777b538SAndroid Build Coastguard Worker   friend class media::FileVideoCaptureDeviceFactory;
627*6777b538SAndroid Build Coastguard Worker   friend class memory_instrumentation::OSMetrics;
628*6777b538SAndroid Build Coastguard Worker   friend class memory_pressure::UserLevelMemoryPressureSignalGenerator;
629*6777b538SAndroid Build Coastguard Worker   friend class metrics::AndroidMetricsServiceClient;
630*6777b538SAndroid Build Coastguard Worker   friend class metrics::CleanExitBeacon;
631*6777b538SAndroid Build Coastguard Worker   friend class module_installer::ScopedAllowModulePakLoad;
632*6777b538SAndroid Build Coastguard Worker   friend class mojo::CoreLibraryInitializer;
633*6777b538SAndroid Build Coastguard Worker   friend class net::GSSAPISharedLibrary;    // http://crbug.com/66702
634*6777b538SAndroid Build Coastguard Worker   friend class net::ProxyConfigServiceWin;  // http://crbug.com/61453
635*6777b538SAndroid Build Coastguard Worker   friend class net::
636*6777b538SAndroid Build Coastguard Worker       ScopedAllowBlockingForSettingGetter;  // http://crbug.com/69057
637*6777b538SAndroid Build Coastguard Worker   friend class net::internal::PemFileCertStore;
638*6777b538SAndroid Build Coastguard Worker   friend class printing::LocalPrinterHandlerDefault;
639*6777b538SAndroid Build Coastguard Worker   friend class printing::PrintBackendServiceManager;
640*6777b538SAndroid Build Coastguard Worker   friend class printing::PrintPreviewUIUntrusted;
641*6777b538SAndroid Build Coastguard Worker   friend class printing::PrinterQuery;
642*6777b538SAndroid Build Coastguard Worker   friend class remote_cocoa::
643*6777b538SAndroid Build Coastguard Worker       DroppedScreenShotCopierMac;  // https://crbug.com/1148078
644*6777b538SAndroid Build Coastguard Worker   friend class remote_cocoa::SelectFileDialogBridge;
645*6777b538SAndroid Build Coastguard Worker   friend class remoting::
646*6777b538SAndroid Build Coastguard Worker       ScopedBypassIOThreadRestrictions;  // http://crbug.com/1144161
647*6777b538SAndroid Build Coastguard Worker   friend class remoting::ScopedAllowBlockingForCrashReporting;
648*6777b538SAndroid Build Coastguard Worker   friend class ui::DrmDisplayHostManager;
649*6777b538SAndroid Build Coastguard Worker   friend class ui::ScopedAllowBlockingForGbmSurface;
650*6777b538SAndroid Build Coastguard Worker   friend class ui::SelectFileDialogLinux;
651*6777b538SAndroid Build Coastguard Worker   friend class weblayer::BrowserContextImpl;
652*6777b538SAndroid Build Coastguard Worker   friend class weblayer::ContentBrowserClientImpl;
653*6777b538SAndroid Build Coastguard Worker   friend class weblayer::ProfileImpl;
654*6777b538SAndroid Build Coastguard Worker   friend class weblayer::WebLayerPathProvider;
655*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_MAC)
656*6777b538SAndroid Build Coastguard Worker   friend class printing::PrintBackendServiceImpl;
657*6777b538SAndroid Build Coastguard Worker #endif
658*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
659*6777b538SAndroid Build Coastguard Worker   friend class base::win::OSInfo;
660*6777b538SAndroid Build Coastguard Worker   friend class content::WebContentsImpl;  // http://crbug.com/1262162
661*6777b538SAndroid Build Coastguard Worker #endif
662*6777b538SAndroid Build Coastguard Worker 
663*6777b538SAndroid Build Coastguard Worker   // Sorted by function name (with namespace), ignoring the return type.
664*6777b538SAndroid Build Coastguard Worker   friend bool ::EnsureBrowserStateDirectoriesCreated(const base::FilePath&,
665*6777b538SAndroid Build Coastguard Worker                                                      const base::FilePath&,
666*6777b538SAndroid Build Coastguard Worker                                                      const base::FilePath&);
667*6777b538SAndroid Build Coastguard Worker   friend Profile* ::GetLastProfileMac();  // http://crbug.com/1176734
668*6777b538SAndroid Build Coastguard Worker   friend bool ::HasWaylandDisplay(
669*6777b538SAndroid Build Coastguard Worker       base::Environment* env);  // http://crbug.com/1246928
670*6777b538SAndroid Build Coastguard Worker   friend bool ash::CameraAppUIShouldEnableLocalOverride(const std::string&);
671*6777b538SAndroid Build Coastguard Worker   friend base::FilePath base::apple::internal::GetExecutablePath();
672*6777b538SAndroid Build Coastguard Worker   friend bool base::internal::ReadProcFile(const FilePath& file,
673*6777b538SAndroid Build Coastguard Worker                                            std::string* buffer);
674*6777b538SAndroid Build Coastguard Worker   friend bool chrome::PathProvider(int,
675*6777b538SAndroid Build Coastguard Worker                                    base::FilePath*);  // http://crbug.com/259796
676*6777b538SAndroid Build Coastguard Worker   friend void chrome::SessionEnding();
677*6777b538SAndroid Build Coastguard Worker   friend bool chromeos::system::IsCoreSchedulingAvailable();
678*6777b538SAndroid Build Coastguard Worker   friend int chromeos::system::NumberOfPhysicalCores();
679*6777b538SAndroid Build Coastguard Worker   friend base::File content::CreateFileForDrop(
680*6777b538SAndroid Build Coastguard Worker       base::FilePath* file_path);  // http://crbug.com/110709
681*6777b538SAndroid Build Coastguard Worker   friend bool disk_cache::CleanupDirectorySync(const base::FilePath&);
682*6777b538SAndroid Build Coastguard Worker   friend bool gl::init::InitializeStaticGLBindings(gl::GLImplementationParts);
683*6777b538SAndroid Build Coastguard Worker 
684*6777b538SAndroid Build Coastguard Worker   ScopedAllowBlocking(const Location& from_here = Location::Current());
685*6777b538SAndroid Build Coastguard Worker   ~ScopedAllowBlocking();
686*6777b538SAndroid Build Coastguard Worker 
687*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
688*6777b538SAndroid Build Coastguard Worker   const AutoReset<BooleanWithStack> resetter_;
689*6777b538SAndroid Build Coastguard Worker #endif
690*6777b538SAndroid Build Coastguard Worker };
691*6777b538SAndroid Build Coastguard Worker 
692*6777b538SAndroid Build Coastguard Worker class [[maybe_unused, nodiscard]] ScopedAllowBlockingForTesting {
693*6777b538SAndroid Build Coastguard Worker  public:
694*6777b538SAndroid Build Coastguard Worker   ScopedAllowBlockingForTesting() = default;
695*6777b538SAndroid Build Coastguard Worker 
696*6777b538SAndroid Build Coastguard Worker   ScopedAllowBlockingForTesting(const ScopedAllowBlockingForTesting&) = delete;
697*6777b538SAndroid Build Coastguard Worker   ScopedAllowBlockingForTesting& operator=(
698*6777b538SAndroid Build Coastguard Worker       const ScopedAllowBlockingForTesting&) = delete;
699*6777b538SAndroid Build Coastguard Worker 
700*6777b538SAndroid Build Coastguard Worker   ~ScopedAllowBlockingForTesting() = default;
701*6777b538SAndroid Build Coastguard Worker 
702*6777b538SAndroid Build Coastguard Worker  private:
703*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
704*6777b538SAndroid Build Coastguard Worker   ScopedAllowBlocking scoped_allow_blocking_;
705*6777b538SAndroid Build Coastguard Worker #endif
706*6777b538SAndroid Build Coastguard Worker };
707*6777b538SAndroid Build Coastguard Worker 
708*6777b538SAndroid Build Coastguard Worker INLINE_OR_NOT_TAIL_CALLED void DisallowBaseSyncPrimitives()
709*6777b538SAndroid Build Coastguard Worker     EMPTY_BODY_IF_DCHECK_IS_OFF;
710*6777b538SAndroid Build Coastguard Worker 
711*6777b538SAndroid Build Coastguard Worker // Disallows singletons within its scope.
712*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT [[maybe_unused, nodiscard]] ScopedDisallowBaseSyncPrimitives {
713*6777b538SAndroid Build Coastguard Worker  public:
714*6777b538SAndroid Build Coastguard Worker   ScopedDisallowBaseSyncPrimitives() DEFAULT_IF_DCHECK_IS_OFF;
715*6777b538SAndroid Build Coastguard Worker 
716*6777b538SAndroid Build Coastguard Worker   ScopedDisallowBaseSyncPrimitives(const ScopedDisallowBaseSyncPrimitives&) =
717*6777b538SAndroid Build Coastguard Worker       delete;
718*6777b538SAndroid Build Coastguard Worker   ScopedDisallowBaseSyncPrimitives& operator=(
719*6777b538SAndroid Build Coastguard Worker       const ScopedDisallowBaseSyncPrimitives&) = delete;
720*6777b538SAndroid Build Coastguard Worker 
721*6777b538SAndroid Build Coastguard Worker   ~ScopedDisallowBaseSyncPrimitives() DEFAULT_IF_DCHECK_IS_OFF;
722*6777b538SAndroid Build Coastguard Worker 
723*6777b538SAndroid Build Coastguard Worker  private:
724*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
725*6777b538SAndroid Build Coastguard Worker   const AutoReset<BooleanWithStack> resetter_;
726*6777b538SAndroid Build Coastguard Worker #endif
727*6777b538SAndroid Build Coastguard Worker };
728*6777b538SAndroid Build Coastguard Worker 
729*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT [[maybe_unused, nodiscard]] ScopedAllowBaseSyncPrimitives {
730*6777b538SAndroid Build Coastguard Worker  public:
731*6777b538SAndroid Build Coastguard Worker   ScopedAllowBaseSyncPrimitives(const ScopedAllowBaseSyncPrimitives&) = delete;
732*6777b538SAndroid Build Coastguard Worker   ScopedAllowBaseSyncPrimitives& operator=(
733*6777b538SAndroid Build Coastguard Worker       const ScopedAllowBaseSyncPrimitives&) = delete;
734*6777b538SAndroid Build Coastguard Worker 
735*6777b538SAndroid Build Coastguard Worker  private:
736*6777b538SAndroid Build Coastguard Worker   // This can only be instantiated by friends. Use
737*6777b538SAndroid Build Coastguard Worker   // ScopedAllowBaseSyncPrimitivesForTesting in unit tests to avoid the friend
738*6777b538SAndroid Build Coastguard Worker   // requirement.
739*6777b538SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(ThreadRestrictionsTest,
740*6777b538SAndroid Build Coastguard Worker                            ScopedAllowBaseSyncPrimitives);
741*6777b538SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(ThreadRestrictionsTest,
742*6777b538SAndroid Build Coastguard Worker                            ScopedAllowBaseSyncPrimitivesResetsState);
743*6777b538SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(ThreadRestrictionsTest,
744*6777b538SAndroid Build Coastguard Worker                            ScopedAllowBaseSyncPrimitivesWithBlockingDisallowed);
745*6777b538SAndroid Build Coastguard Worker 
746*6777b538SAndroid Build Coastguard Worker   // Allowed usage:
747*6777b538SAndroid Build Coastguard Worker   // Sorted by class name (with namespace).
748*6777b538SAndroid Build Coastguard Worker   friend class ::ChromeNSSCryptoModuleDelegate;
749*6777b538SAndroid Build Coastguard Worker   friend class ::PartnerBookmarksReader;
750*6777b538SAndroid Build Coastguard Worker   friend class ::tracing::FuchsiaPerfettoProducerConnector;
751*6777b538SAndroid Build Coastguard Worker   friend class android_webview::JsSandboxIsolate;
752*6777b538SAndroid Build Coastguard Worker   friend class base::SimpleThread;
753*6777b538SAndroid Build Coastguard Worker   friend class base::internal::GetAppOutputScopedAllowBaseSyncPrimitives;
754*6777b538SAndroid Build Coastguard Worker   friend class blink::SourceStream;
755*6777b538SAndroid Build Coastguard Worker   friend class blink::VideoTrackRecorderImplContextProvider;
756*6777b538SAndroid Build Coastguard Worker   friend class blink::WorkerThread;
757*6777b538SAndroid Build Coastguard Worker   friend class blink::scheduler::NonMainThreadImpl;
758*6777b538SAndroid Build Coastguard Worker   friend class cc::CategorizedWorkerPoolImpl;
759*6777b538SAndroid Build Coastguard Worker   friend class cc::CategorizedWorkerPoolJob;
760*6777b538SAndroid Build Coastguard Worker   friend class content::BrowserMainLoop;
761*6777b538SAndroid Build Coastguard Worker   friend class content::BrowserProcessIOThread;
762*6777b538SAndroid Build Coastguard Worker   friend class content::DWriteFontCollectionProxy;
763*6777b538SAndroid Build Coastguard Worker   friend class content::RendererBlinkPlatformImpl;
764*6777b538SAndroid Build Coastguard Worker   friend class content::ServiceWorkerContextClient;
765*6777b538SAndroid Build Coastguard Worker   friend class device::UsbContext;
766*6777b538SAndroid Build Coastguard Worker   friend class enterprise_connectors::LinuxKeyRotationCommand;
767*6777b538SAndroid Build Coastguard Worker   friend class history_report::HistoryReportJniBridge;
768*6777b538SAndroid Build Coastguard Worker   friend class internal::TaskTracker;
769*6777b538SAndroid Build Coastguard Worker   friend class leveldb::port::CondVar;
770*6777b538SAndroid Build Coastguard Worker   friend class nearby::chrome::ScheduledExecutor;
771*6777b538SAndroid Build Coastguard Worker   friend class nearby::chrome::SubmittableExecutor;
772*6777b538SAndroid Build Coastguard Worker   friend class media::AudioOutputDevice;
773*6777b538SAndroid Build Coastguard Worker   friend class media::BlockingUrlProtocol;
774*6777b538SAndroid Build Coastguard Worker   template <class WorkerInterface,
775*6777b538SAndroid Build Coastguard Worker             class WorkerImpl,
776*6777b538SAndroid Build Coastguard Worker             class Worker,
777*6777b538SAndroid Build Coastguard Worker             class WorkerStatus,
778*6777b538SAndroid Build Coastguard Worker             WorkerStatus StatusNotOk,
779*6777b538SAndroid Build Coastguard Worker             WorkerStatus StatusOk,
780*6777b538SAndroid Build Coastguard Worker             WorkerStatus StatusWork>
781*6777b538SAndroid Build Coastguard Worker   friend class media::CodecWorkerImpl;
782*6777b538SAndroid Build Coastguard Worker   friend class media::MojoVideoEncodeAccelerator;
783*6777b538SAndroid Build Coastguard Worker   friend class mojo::core::ScopedIPCSupport;
784*6777b538SAndroid Build Coastguard Worker   friend class net::MultiThreadedCertVerifierScopedAllowBaseSyncPrimitives;
785*6777b538SAndroid Build Coastguard Worker   friend class rlz_lib::FinancialPing;
786*6777b538SAndroid Build Coastguard Worker   friend class shell_integration_linux::
787*6777b538SAndroid Build Coastguard Worker       LaunchXdgUtilityScopedAllowBaseSyncPrimitives;
788*6777b538SAndroid Build Coastguard Worker   friend class storage::ObfuscatedFileUtil;
789*6777b538SAndroid Build Coastguard Worker   friend class syncer::HttpBridge;
790*6777b538SAndroid Build Coastguard Worker   friend class syncer::GetLocalChangesRequest;
791*6777b538SAndroid Build Coastguard Worker   friend class updater::SystemctlLauncherScopedAllowBaseSyncPrimitives;
792*6777b538SAndroid Build Coastguard Worker 
793*6777b538SAndroid Build Coastguard Worker   // Usage that should be fixed:
794*6777b538SAndroid Build Coastguard Worker   // Sorted by class name (with namespace).
795*6777b538SAndroid Build Coastguard Worker   friend class ::NativeBackendKWallet;  // http://crbug.com/125331
796*6777b538SAndroid Build Coastguard Worker   friend class blink::VideoFrameResourceProvider;  // http://crbug.com/878070
797*6777b538SAndroid Build Coastguard Worker 
798*6777b538SAndroid Build Coastguard Worker   ScopedAllowBaseSyncPrimitives() DEFAULT_IF_DCHECK_IS_OFF;
799*6777b538SAndroid Build Coastguard Worker   ~ScopedAllowBaseSyncPrimitives() DEFAULT_IF_DCHECK_IS_OFF;
800*6777b538SAndroid Build Coastguard Worker 
801*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
802*6777b538SAndroid Build Coastguard Worker   const AutoReset<BooleanWithStack> resetter_;
803*6777b538SAndroid Build Coastguard Worker #endif
804*6777b538SAndroid Build Coastguard Worker };
805*6777b538SAndroid Build Coastguard Worker 
806*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT
807*6777b538SAndroid Build Coastguard Worker     [[maybe_unused,
808*6777b538SAndroid Build Coastguard Worker       nodiscard]] ScopedAllowBaseSyncPrimitivesOutsideBlockingScope {
809*6777b538SAndroid Build Coastguard Worker  public:
810*6777b538SAndroid Build Coastguard Worker   ScopedAllowBaseSyncPrimitivesOutsideBlockingScope(
811*6777b538SAndroid Build Coastguard Worker       const ScopedAllowBaseSyncPrimitivesOutsideBlockingScope&) = delete;
812*6777b538SAndroid Build Coastguard Worker   ScopedAllowBaseSyncPrimitivesOutsideBlockingScope& operator=(
813*6777b538SAndroid Build Coastguard Worker       const ScopedAllowBaseSyncPrimitivesOutsideBlockingScope&) = delete;
814*6777b538SAndroid Build Coastguard Worker 
815*6777b538SAndroid Build Coastguard Worker  private:
816*6777b538SAndroid Build Coastguard Worker   // This can only be instantiated by friends. Use
817*6777b538SAndroid Build Coastguard Worker   // ScopedAllowBaseSyncPrimitivesForTesting in unit tests to avoid the friend
818*6777b538SAndroid Build Coastguard Worker   // requirement.
819*6777b538SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(ThreadRestrictionsTest,
820*6777b538SAndroid Build Coastguard Worker                            ScopedAllowBaseSyncPrimitivesOutsideBlockingScope);
821*6777b538SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(
822*6777b538SAndroid Build Coastguard Worker       ThreadRestrictionsTest,
823*6777b538SAndroid Build Coastguard Worker       ScopedAllowBaseSyncPrimitivesOutsideBlockingScopeResetsState);
824*6777b538SAndroid Build Coastguard Worker 
825*6777b538SAndroid Build Coastguard Worker   // Allowed usage:
826*6777b538SAndroid Build Coastguard Worker   // Sorted by class name (with namespace).
827*6777b538SAndroid Build Coastguard Worker   friend class ::BrowserProcessImpl;  // http://crbug.com/125207
828*6777b538SAndroid Build Coastguard Worker   friend class ::KeyStorageLinux;
829*6777b538SAndroid Build Coastguard Worker   friend class ::NativeDesktopMediaList;
830*6777b538SAndroid Build Coastguard Worker   friend class android::JavaHandlerThread;
831*6777b538SAndroid Build Coastguard Worker   friend class android_webview::
832*6777b538SAndroid Build Coastguard Worker       AwFormDatabaseService;  // http://crbug.com/904431
833*6777b538SAndroid Build Coastguard Worker   friend class android_webview::CookieManager;
834*6777b538SAndroid Build Coastguard Worker   friend class android_webview::VizCompositorThreadRunnerWebView;
835*6777b538SAndroid Build Coastguard Worker   friend class audio::OutputDevice;
836*6777b538SAndroid Build Coastguard Worker   friend class base::FileDescriptorWatcher;
837*6777b538SAndroid Build Coastguard Worker   friend class base::ScopedAllowThreadRecallForStackSamplingProfiler;
838*6777b538SAndroid Build Coastguard Worker   friend class base::StackSamplingProfiler;
839*6777b538SAndroid Build Coastguard Worker   friend class base::internal::JobTaskSource;
840*6777b538SAndroid Build Coastguard Worker   friend class base::sequence_manager::internal::TaskQueueImpl;
841*6777b538SAndroid Build Coastguard Worker   friend class base::sequence_manager::internal::WorkTracker;
842*6777b538SAndroid Build Coastguard Worker   friend class base::win::ObjectWatcher;
843*6777b538SAndroid Build Coastguard Worker   friend class blink::AudioDestination;
844*6777b538SAndroid Build Coastguard Worker   friend class blink::RTCVideoDecoderAdapter;
845*6777b538SAndroid Build Coastguard Worker   friend class blink::RTCVideoEncoder;
846*6777b538SAndroid Build Coastguard Worker   friend class blink::WebRtcVideoFrameAdapter;
847*6777b538SAndroid Build Coastguard Worker   friend class cc::CategorizedWorkerPoolImpl;
848*6777b538SAndroid Build Coastguard Worker   friend class cc::CategorizedWorkerPoolJob;
849*6777b538SAndroid Build Coastguard Worker   friend class cc::CategorizedWorkerPool;
850*6777b538SAndroid Build Coastguard Worker   friend class cc::TileTaskManagerImpl;
851*6777b538SAndroid Build Coastguard Worker   friend class content::DesktopCaptureDevice;
852*6777b538SAndroid Build Coastguard Worker   friend class content::EmergencyTraceFinalisationCoordinator;
853*6777b538SAndroid Build Coastguard Worker   friend class content::InProcessUtilityThread;
854*6777b538SAndroid Build Coastguard Worker   friend class content::RenderProcessHost;
855*6777b538SAndroid Build Coastguard Worker   friend class content::SandboxHostLinux;
856*6777b538SAndroid Build Coastguard Worker   friend class content::ScopedAllowWaitForDebugURL;
857*6777b538SAndroid Build Coastguard Worker   friend class content::SynchronousCompositor;
858*6777b538SAndroid Build Coastguard Worker   friend class content::SynchronousCompositorHost;
859*6777b538SAndroid Build Coastguard Worker   friend class content::SynchronousCompositorSyncCallBridge;
860*6777b538SAndroid Build Coastguard Worker   friend class media::AudioInputDevice;
861*6777b538SAndroid Build Coastguard Worker   friend class media::AudioOutputDevice;
862*6777b538SAndroid Build Coastguard Worker   friend class media::PaintCanvasVideoRenderer;
863*6777b538SAndroid Build Coastguard Worker   friend class media::V4L2DevicePoller;  // TODO(1513721): remove this.
864*6777b538SAndroid Build Coastguard Worker   friend class mojo::SyncCallRestrictions;
865*6777b538SAndroid Build Coastguard Worker   friend class mojo::core::ipcz_driver::MojoTrap;
866*6777b538SAndroid Build Coastguard Worker   friend class net::NetworkConfigWatcherAppleThread;
867*6777b538SAndroid Build Coastguard Worker   friend class ui::DrmThreadProxy;
868*6777b538SAndroid Build Coastguard Worker   friend class viz::ClientGpuMemoryBufferManager;
869*6777b538SAndroid Build Coastguard Worker   friend class viz::HostGpuMemoryBufferManager;
870*6777b538SAndroid Build Coastguard Worker   friend class vr::VrShell;
871*6777b538SAndroid Build Coastguard Worker 
872*6777b538SAndroid Build Coastguard Worker   // Usage that should be fixed:
873*6777b538SAndroid Build Coastguard Worker   friend class ::ash::system::StatisticsProviderImpl;  // http://b/261818124
874*6777b538SAndroid Build Coastguard Worker   friend class ::chromeos::BlockingMethodCaller;  // http://crbug.com/125360
875*6777b538SAndroid Build Coastguard Worker   friend class base::Thread;                      // http://crbug.com/918039
876*6777b538SAndroid Build Coastguard Worker   friend class cc::CompletionEvent;               // http://crbug.com/902653
877*6777b538SAndroid Build Coastguard Worker   friend class content::
878*6777b538SAndroid Build Coastguard Worker       BrowserGpuChannelHostFactory;                 // http://crbug.com/125248
879*6777b538SAndroid Build Coastguard Worker   friend class content::TextInputClientMac;         // http://crbug.com/121917
880*6777b538SAndroid Build Coastguard Worker   friend class dbus::Bus;                           // http://crbug.com/125222
881*6777b538SAndroid Build Coastguard Worker   friend class discardable_memory::
882*6777b538SAndroid Build Coastguard Worker       ClientDiscardableSharedMemoryManager;         // http://crbug.com/1396355
883*6777b538SAndroid Build Coastguard Worker   friend class disk_cache::BackendImpl;             // http://crbug.com/74623
884*6777b538SAndroid Build Coastguard Worker   friend class disk_cache::InFlightIO;              // http://crbug.com/74623
885*6777b538SAndroid Build Coastguard Worker   friend class midi::TaskService;                   // https://crbug.com/796830
886*6777b538SAndroid Build Coastguard Worker   friend class net::
887*6777b538SAndroid Build Coastguard Worker       MultiThreadedProxyResolverScopedAllowJoinOnIO;  // http://crbug.com/69710
888*6777b538SAndroid Build Coastguard Worker   friend class net::NetworkChangeNotifierApple;       // http://crbug.com/125097
889*6777b538SAndroid Build Coastguard Worker   friend class net::internal::AddressTrackerLinux;    // http://crbug.com/125097
890*6777b538SAndroid Build Coastguard Worker   friend class proxy_resolver::
891*6777b538SAndroid Build Coastguard Worker       ScopedAllowThreadJoinForProxyResolverV8Tracing;  // http://crbug.com/69710
892*6777b538SAndroid Build Coastguard Worker   friend class remoting::AutoThread;  // https://crbug.com/944316
893*6777b538SAndroid Build Coastguard Worker   friend class remoting::protocol::
894*6777b538SAndroid Build Coastguard Worker       ScopedAllowSyncPrimitivesForWebRtcDataStreamAdapter;  // http://b/233844893
895*6777b538SAndroid Build Coastguard Worker   friend class remoting::protocol::
896*6777b538SAndroid Build Coastguard Worker       ScopedAllowSyncPrimitivesForWebRtcTransport;  // http://crbug.com/1198501
897*6777b538SAndroid Build Coastguard Worker   friend class remoting::protocol::
898*6777b538SAndroid Build Coastguard Worker       ScopedAllowSyncPrimitivesForWebRtcVideoStream;  // http://b/304681143
899*6777b538SAndroid Build Coastguard Worker   friend class remoting::protocol::
900*6777b538SAndroid Build Coastguard Worker       ScopedAllowThreadJoinForWebRtcTransport;  // http://crbug.com/660081
901*6777b538SAndroid Build Coastguard Worker   // Not used in production yet, https://crbug.com/844078.
902*6777b538SAndroid Build Coastguard Worker   friend class service_manager::ServiceProcessLauncher;
903*6777b538SAndroid Build Coastguard Worker   friend class ui::WindowResizeHelperMac;  // http://crbug.com/902829
904*6777b538SAndroid Build Coastguard Worker 
905*6777b538SAndroid Build Coastguard Worker   ScopedAllowBaseSyncPrimitivesOutsideBlockingScope(
906*6777b538SAndroid Build Coastguard Worker       const Location& from_here = Location::Current());
907*6777b538SAndroid Build Coastguard Worker 
908*6777b538SAndroid Build Coastguard Worker   ~ScopedAllowBaseSyncPrimitivesOutsideBlockingScope();
909*6777b538SAndroid Build Coastguard Worker 
910*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
911*6777b538SAndroid Build Coastguard Worker   const AutoReset<BooleanWithStack> resetter_;
912*6777b538SAndroid Build Coastguard Worker #endif
913*6777b538SAndroid Build Coastguard Worker };
914*6777b538SAndroid Build Coastguard Worker 
915*6777b538SAndroid Build Coastguard Worker // Allow base-sync-primitives in tests, doesn't require explicit friend'ing like
916*6777b538SAndroid Build Coastguard Worker // ScopedAllowBaseSyncPrimitives-types aimed at production do.
917*6777b538SAndroid Build Coastguard Worker // Note: For WaitableEvents in the test logic, base::TestWaitableEvent is
918*6777b538SAndroid Build Coastguard Worker // exposed as a convenience to avoid the need for
919*6777b538SAndroid Build Coastguard Worker // ScopedAllowBaseSyncPrimitivesForTesting.
920*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT
921*6777b538SAndroid Build Coastguard Worker     [[maybe_unused, nodiscard]] ScopedAllowBaseSyncPrimitivesForTesting {
922*6777b538SAndroid Build Coastguard Worker  public:
923*6777b538SAndroid Build Coastguard Worker   ScopedAllowBaseSyncPrimitivesForTesting() DEFAULT_IF_DCHECK_IS_OFF;
924*6777b538SAndroid Build Coastguard Worker 
925*6777b538SAndroid Build Coastguard Worker   ScopedAllowBaseSyncPrimitivesForTesting(
926*6777b538SAndroid Build Coastguard Worker       const ScopedAllowBaseSyncPrimitivesForTesting&) = delete;
927*6777b538SAndroid Build Coastguard Worker   ScopedAllowBaseSyncPrimitivesForTesting& operator=(
928*6777b538SAndroid Build Coastguard Worker       const ScopedAllowBaseSyncPrimitivesForTesting&) = delete;
929*6777b538SAndroid Build Coastguard Worker 
930*6777b538SAndroid Build Coastguard Worker   ~ScopedAllowBaseSyncPrimitivesForTesting() DEFAULT_IF_DCHECK_IS_OFF;
931*6777b538SAndroid Build Coastguard Worker 
932*6777b538SAndroid Build Coastguard Worker  private:
933*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
934*6777b538SAndroid Build Coastguard Worker   const AutoReset<BooleanWithStack> resetter_;
935*6777b538SAndroid Build Coastguard Worker #endif
936*6777b538SAndroid Build Coastguard Worker };
937*6777b538SAndroid Build Coastguard Worker 
938*6777b538SAndroid Build Coastguard Worker // Counterpart to base::DisallowUnresponsiveTasks() for tests to allow them to
939*6777b538SAndroid Build Coastguard Worker // block their thread after it was banned.
940*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT
941*6777b538SAndroid Build Coastguard Worker     [[maybe_unused, nodiscard]] ScopedAllowUnresponsiveTasksForTesting {
942*6777b538SAndroid Build Coastguard Worker  public:
943*6777b538SAndroid Build Coastguard Worker   ScopedAllowUnresponsiveTasksForTesting() DEFAULT_IF_DCHECK_IS_OFF;
944*6777b538SAndroid Build Coastguard Worker 
945*6777b538SAndroid Build Coastguard Worker   ScopedAllowUnresponsiveTasksForTesting(
946*6777b538SAndroid Build Coastguard Worker       const ScopedAllowUnresponsiveTasksForTesting&) = delete;
947*6777b538SAndroid Build Coastguard Worker   ScopedAllowUnresponsiveTasksForTesting& operator=(
948*6777b538SAndroid Build Coastguard Worker       const ScopedAllowUnresponsiveTasksForTesting&) = delete;
949*6777b538SAndroid Build Coastguard Worker 
950*6777b538SAndroid Build Coastguard Worker   ~ScopedAllowUnresponsiveTasksForTesting() DEFAULT_IF_DCHECK_IS_OFF;
951*6777b538SAndroid Build Coastguard Worker 
952*6777b538SAndroid Build Coastguard Worker  private:
953*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
954*6777b538SAndroid Build Coastguard Worker   const AutoReset<BooleanWithStack> base_sync_resetter_;
955*6777b538SAndroid Build Coastguard Worker   const AutoReset<BooleanWithStack> blocking_resetter_;
956*6777b538SAndroid Build Coastguard Worker   const AutoReset<BooleanWithStack> cpu_resetter_;
957*6777b538SAndroid Build Coastguard Worker #endif
958*6777b538SAndroid Build Coastguard Worker };
959*6777b538SAndroid Build Coastguard Worker 
960*6777b538SAndroid Build Coastguard Worker namespace internal {
961*6777b538SAndroid Build Coastguard Worker 
962*6777b538SAndroid Build Coastguard Worker // Asserts that waiting on a //base sync primitive is allowed in the current
963*6777b538SAndroid Build Coastguard Worker // scope.
964*6777b538SAndroid Build Coastguard Worker INLINE_OR_NOT_TAIL_CALLED void AssertBaseSyncPrimitivesAllowed()
965*6777b538SAndroid Build Coastguard Worker     EMPTY_BODY_IF_DCHECK_IS_OFF;
966*6777b538SAndroid Build Coastguard Worker 
967*6777b538SAndroid Build Coastguard Worker // Resets all thread restrictions on the current thread.
968*6777b538SAndroid Build Coastguard Worker INLINE_OR_NOT_TAIL_CALLED void ResetThreadRestrictionsForTesting()
969*6777b538SAndroid Build Coastguard Worker     EMPTY_BODY_IF_DCHECK_IS_OFF;
970*6777b538SAndroid Build Coastguard Worker 
971*6777b538SAndroid Build Coastguard Worker // Check whether the current thread is allowed to use singletons (Singleton /
972*6777b538SAndroid Build Coastguard Worker // LazyInstance).  DCHECKs if not.
973*6777b538SAndroid Build Coastguard Worker INLINE_OR_NOT_TAIL_CALLED void AssertSingletonAllowed()
974*6777b538SAndroid Build Coastguard Worker     EMPTY_BODY_IF_DCHECK_IS_OFF;
975*6777b538SAndroid Build Coastguard Worker 
976*6777b538SAndroid Build Coastguard Worker }  // namespace internal
977*6777b538SAndroid Build Coastguard Worker 
978*6777b538SAndroid Build Coastguard Worker // Disallow using singleton on the current thread.
979*6777b538SAndroid Build Coastguard Worker INLINE_OR_NOT_TAIL_CALLED void DisallowSingleton() EMPTY_BODY_IF_DCHECK_IS_OFF;
980*6777b538SAndroid Build Coastguard Worker 
981*6777b538SAndroid Build Coastguard Worker // Disallows singletons within its scope.
982*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT [[maybe_unused, nodiscard]] ScopedDisallowSingleton {
983*6777b538SAndroid Build Coastguard Worker  public:
984*6777b538SAndroid Build Coastguard Worker   ScopedDisallowSingleton() DEFAULT_IF_DCHECK_IS_OFF;
985*6777b538SAndroid Build Coastguard Worker 
986*6777b538SAndroid Build Coastguard Worker   ScopedDisallowSingleton(const ScopedDisallowSingleton&) = delete;
987*6777b538SAndroid Build Coastguard Worker   ScopedDisallowSingleton& operator=(const ScopedDisallowSingleton&) = delete;
988*6777b538SAndroid Build Coastguard Worker 
989*6777b538SAndroid Build Coastguard Worker   ~ScopedDisallowSingleton() DEFAULT_IF_DCHECK_IS_OFF;
990*6777b538SAndroid Build Coastguard Worker 
991*6777b538SAndroid Build Coastguard Worker  private:
992*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
993*6777b538SAndroid Build Coastguard Worker   const AutoReset<BooleanWithStack> resetter_;
994*6777b538SAndroid Build Coastguard Worker #endif
995*6777b538SAndroid Build Coastguard Worker };
996*6777b538SAndroid Build Coastguard Worker 
997*6777b538SAndroid Build Coastguard Worker // Asserts that running long CPU work is allowed in the current scope.
998*6777b538SAndroid Build Coastguard Worker INLINE_OR_NOT_TAIL_CALLED void AssertLongCPUWorkAllowed()
999*6777b538SAndroid Build Coastguard Worker     EMPTY_BODY_IF_DCHECK_IS_OFF;
1000*6777b538SAndroid Build Coastguard Worker 
1001*6777b538SAndroid Build Coastguard Worker INLINE_OR_NOT_TAIL_CALLED void DisallowUnresponsiveTasks()
1002*6777b538SAndroid Build Coastguard Worker     EMPTY_BODY_IF_DCHECK_IS_OFF;
1003*6777b538SAndroid Build Coastguard Worker 
1004*6777b538SAndroid Build Coastguard Worker // Friend-only methods to permanently allow the current thread to use
1005*6777b538SAndroid Build Coastguard Worker // blocking/sync-primitives calls. Threads start out in the *allowed* state but
1006*6777b538SAndroid Build Coastguard Worker // are typically *disallowed* via the above base::Disallow*() methods after
1007*6777b538SAndroid Build Coastguard Worker // being initialized.
1008*6777b538SAndroid Build Coastguard Worker //
1009*6777b538SAndroid Build Coastguard Worker // Only use these to permanently set the allowance on a thread, e.g. on
1010*6777b538SAndroid Build Coastguard Worker // shutdown. For temporary allowances, use scopers above.
1011*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT PermanentThreadAllowance {
1012*6777b538SAndroid Build Coastguard Worker  public:
1013*6777b538SAndroid Build Coastguard Worker   // Class is merely a namespace-with-friends.
1014*6777b538SAndroid Build Coastguard Worker   PermanentThreadAllowance() = delete;
1015*6777b538SAndroid Build Coastguard Worker 
1016*6777b538SAndroid Build Coastguard Worker  private:
1017*6777b538SAndroid Build Coastguard Worker   // Sorted by class name (with namespace)
1018*6777b538SAndroid Build Coastguard Worker   friend class base::TestCustomDisallow;
1019*6777b538SAndroid Build Coastguard Worker   friend class content::BrowserMainLoop;
1020*6777b538SAndroid Build Coastguard Worker   friend class content::BrowserTestBase;
1021*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_IOS)
1022*6777b538SAndroid Build Coastguard Worker   friend class content::ContentMainRunnerImpl;
1023*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_IOS)
1024*6777b538SAndroid Build Coastguard Worker   friend class web::WebMainLoop;
1025*6777b538SAndroid Build Coastguard Worker 
1026*6777b538SAndroid Build Coastguard Worker   static void AllowBlocking() EMPTY_BODY_IF_DCHECK_IS_OFF;
1027*6777b538SAndroid Build Coastguard Worker   static void AllowBaseSyncPrimitives() EMPTY_BODY_IF_DCHECK_IS_OFF;
1028*6777b538SAndroid Build Coastguard Worker };
1029*6777b538SAndroid Build Coastguard Worker 
1030*6777b538SAndroid Build Coastguard Worker #undef INLINE_OR_NOT_TAIL_CALLED
1031*6777b538SAndroid Build Coastguard Worker #undef EMPTY_BODY_IF_DCHECK_IS_OFF
1032*6777b538SAndroid Build Coastguard Worker #undef DEFAULT_IF_DCHECK_IS_OFF
1033*6777b538SAndroid Build Coastguard Worker 
1034*6777b538SAndroid Build Coastguard Worker }  // namespace base
1035*6777b538SAndroid Build Coastguard Worker 
1036*6777b538SAndroid Build Coastguard Worker #endif  // BASE_THREADING_THREAD_RESTRICTIONS_H_
1037