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