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