| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725 | 
							- // Copyright (c) 2012 The Chromium Authors. All rights reserved.
 
- // Use of this source code is governed by a BSD-style license that can be
 
- // found in the LICENSE file.
 
- #ifndef BASE_THREADING_THREAD_RESTRICTIONS_H_
 
- #define BASE_THREADING_THREAD_RESTRICTIONS_H_
 
- #include "base/base_export.h"
 
- #include "base/check_op.h"
 
- #include "base/gtest_prod_util.h"
 
- #include "base/location.h"
 
- #include "base/macros.h"
 
- #include "base/threading/hang_watcher.h"
 
- // -----------------------------------------------------------------------------
 
- // Usage documentation
 
- // -----------------------------------------------------------------------------
 
- //
 
- // Overview:
 
- // This file exposes functions to ban and allow certain slow operations
 
- // on a per-thread basis. To annotate *usage* of such slow operations, refer to
 
- // scoped_blocking_call.h instead.
 
- //
 
- // Specific allowances that can be controlled in this file are:
 
- // - Blocking call: Refers to any call that causes the calling thread to wait
 
- //   off-CPU. It includes but is not limited to calls that wait on synchronous
 
- //   file I/O operations: read or write a file from disk, interact with a pipe
 
- //   or a socket, rename or delete a file, enumerate files in a directory, etc.
 
- //   Acquiring a low contention lock is not considered a blocking call.
 
- //
 
- // - Waiting on a //base sync primitive: Refers to calling one of these methods:
 
- //   - base::WaitableEvent::*Wait*
 
- //   - base::ConditionVariable::*Wait*
 
- //   - base::Process::WaitForExit*
 
- //
 
- // - Long CPU work: Refers to any code that takes more than 100 ms to
 
- //   run when there is no CPU contention and no hard page faults and therefore,
 
- //   is not suitable to run on a thread required to keep the browser responsive
 
- //   (where jank could be visible to the user).
 
- //
 
- // The following disallowance functions are offered:
 
- //  - DisallowBlocking(): Disallows blocking calls on the current thread.
 
- //  - DisallowBaseSyncPrimitives(): Disallows waiting on a //base sync primitive
 
- //    on the current thread.
 
- //  - DisallowUnresponsiveTasks() Disallows blocking calls, waiting on a //base
 
- //    sync primitive, and long cpu work on the current thread.
 
- //
 
- // In addition, scoped-allowance mechanisms are offered to make an exception
 
- // within a scope for a behavior that is normally disallowed.
 
- //  - ScopedAllowBlocking(ForTesting): Allows blocking calls.
 
- //  - ScopedAllowBaseSyncPrimitives(ForTesting)(OutsideBlockingScope): Allow
 
- //    waiting on a //base sync primitive. The OutsideBlockingScope suffix allows
 
- //    uses in a scope where blocking is also disallowed.
 
- //
 
- // Avoid using allowances outside of unit tests. In unit tests, use allowances
 
- // with the suffix "ForTesting".
 
- //
 
- // Prefer making blocking calls from tasks posted to base::ThreadPoolInstance
 
- // with base::MayBlock().
 
- //
 
- // Instead of waiting on a WaitableEvent or a ConditionVariable, prefer putting
 
- // the work that should happen after the wait in a continuation callback and
 
- // post it from where the WaitableEvent or ConditionVariable would have been
 
- // signaled. If something needs to be scheduled after many tasks have executed,
 
- // use base::BarrierClosure.
 
- //
 
- // On Windows, join processes asynchronously using base::win::ObjectWatcher.
 
- //
 
- // Where unavoidable, put ScopedAllow* instances in the narrowest scope possible
 
- // in the caller making the blocking call but no further down. For example: if a
 
- // Cleanup() method needs to do a blocking call, document Cleanup() as blocking
 
- // and add a ScopedAllowBlocking instance in callers that can't avoid making
 
- // this call from a context where blocking is banned, as such:
 
- //
 
- //   void Client::MyMethod() {
 
- //     (...)
 
- //     {
 
- //       // Blocking is okay here because XYZ.
 
- //       ScopedAllowBlocking allow_blocking;
 
- //       my_foo_->Cleanup();
 
- //     }
 
- //     (...)
 
- //   }
 
- //
 
- //   // This method can block.
 
- //   void Foo::Cleanup() {
 
- //     // Do NOT add the ScopedAllowBlocking in Cleanup() directly as that hides
 
- //     // its blocking nature from unknowing callers and defeats the purpose of
 
- //     // these checks.
 
- //     FlushStateToDisk();
 
- //   }
 
- //
 
- // Note: In rare situations where the blocking call is an implementation detail
 
- // (i.e. the impl makes a call that invokes AssertBlockingAllowed() but it
 
- // somehow knows that in practice this will not block), it might be okay to hide
 
- // the ScopedAllowBlocking instance in the impl with a comment explaining why
 
- // that's okay.
 
- class BrowserProcessImpl;
 
- class ChromeNSSCryptoModuleDelegate;
 
- class HistogramSynchronizer;
 
- class KeyStorageLinux;
 
- class NativeBackendKWallet;
 
- class NativeDesktopMediaList;
 
- namespace android_webview {
 
- class AwFormDatabaseService;
 
- class CookieManager;
 
- class ScopedAllowInitGLBindings;
 
- class VizCompositorThreadRunnerWebView;
 
- }
 
- namespace audio {
 
- class OutputDevice;
 
- }
 
- namespace blink {
 
- class DiskDataAllocator;
 
- class RTCVideoDecoderAdapter;
 
- class RTCVideoEncoder;
 
- class SourceStream;
 
- class VideoFrameResourceProvider;
 
- class WorkerThread;
 
- namespace scheduler {
 
- class WorkerThread;
 
- }
 
- }
 
- namespace cc {
 
- class CompletionEvent;
 
- class TileTaskManagerImpl;
 
- }
 
- namespace chromeos {
 
- class BlockingMethodCaller;
 
- class MojoUtils;
 
- namespace system {
 
- class StatisticsProviderImpl;
 
- }
 
- }
 
- namespace chrome_browser_net {
 
- class Predictor;
 
- }
 
- namespace chrome_cleaner {
 
- class SystemReportComponent;
 
- }
 
- namespace content {
 
- class BrowserGpuChannelHostFactory;
 
- class BrowserMainLoop;
 
- class BrowserProcessSubThread;
 
- class BrowserShutdownProfileDumper;
 
- class BrowserTestBase;
 
- class CategorizedWorkerPool;
 
- class DesktopCaptureDevice;
 
- class InProcessUtilityThread;
 
- class NestedMessagePumpAndroid;
 
- class NetworkServiceInstancePrivate;
 
- class PepperPrintSettingsManagerImpl;
 
- class RenderProcessHostImpl;
 
- class RenderWidgetHostViewMac;
 
- class RTCVideoDecoder;
 
- class SandboxHostLinux;
 
- class ScopedAllowWaitForDebugURL;
 
- class ServiceWorkerContextClient;
 
- class SoftwareOutputDeviceMus;
 
- class SynchronousCompositor;
 
- class SynchronousCompositorHost;
 
- class SynchronousCompositorSyncCallBridge;
 
- class TextInputClientMac;
 
- class WaitForProcessesToDumpProfilingInfo;
 
- class WebContentsViewMac;
 
- }  // namespace content
 
- namespace cronet {
 
- class CronetPrefsManager;
 
- class CronetURLRequestContext;
 
- }  // namespace cronet
 
- namespace dbus {
 
- class Bus;
 
- }
 
- namespace disk_cache {
 
- class BackendImpl;
 
- class InFlightIO;
 
- }
 
- namespace functions {
 
- class ExecScriptScopedAllowBaseSyncPrimitives;
 
- }
 
- namespace history_report {
 
- class HistoryReportJniBridge;
 
- }
 
- namespace gpu {
 
- class GpuChannelHost;
 
- }
 
- namespace leveldb_env {
 
- class DBTracker;
 
- }
 
- namespace location {
 
- namespace nearby {
 
- namespace chrome {
 
- class ScheduledExecutor;
 
- class SubmittableExecutor;
 
- }  // namespace chrome
 
- }  // namespace nearby
 
- }  // namespace location
 
- namespace media {
 
- class AudioInputDevice;
 
- class AudioOutputDevice;
 
- class BlockingUrlProtocol;
 
- class PaintCanvasVideoRenderer;
 
- }
 
- namespace memory_instrumentation {
 
- class OSMetrics;
 
- }
 
- namespace metrics {
 
- class AndroidMetricsServiceClient;
 
- }
 
- namespace midi {
 
- class TaskService;  // https://crbug.com/796830
 
- }
 
- namespace module_installer {
 
- class ScopedAllowModulePakLoad;
 
- }
 
- namespace mojo {
 
- class CoreLibraryInitializer;
 
- class SyncCallRestrictions;
 
- namespace core {
 
- class ScopedIPCSupport;
 
- }
 
- }
 
- namespace printing {
 
- class LocalPrinterHandlerDefault;
 
- class PrintJobWorker;
 
- class PrinterQuery;
 
- }
 
- namespace rlz_lib {
 
- class FinancialPing;
 
- }
 
- namespace syncer {
 
- class GetLocalChangesRequest;
 
- class HttpBridge;
 
- class ModelSafeWorker;
 
- }
 
- namespace ui {
 
- class CommandBufferClientImpl;
 
- class CommandBufferLocal;
 
- class DrmThreadProxy;
 
- class GpuState;
 
- }
 
- namespace weblayer {
 
- class BrowserContextImpl;
 
- class ContentBrowserClientImpl;
 
- class ProfileImpl;
 
- class WebLayerPathProvider;
 
- }
 
- namespace net {
 
- class MultiThreadedCertVerifierScopedAllowBaseSyncPrimitives;
 
- class MultiThreadedProxyResolverScopedAllowJoinOnIO;
 
- class NetworkChangeNotifierMac;
 
- class NetworkConfigWatcherMacThread;
 
- namespace internal {
 
- class AddressTrackerLinux;
 
- }
 
- }
 
- namespace proxy_resolver {
 
- class ScopedAllowThreadJoinForProxyResolverV8Tracing;
 
- }
 
- namespace remoting {
 
- class AutoThread;
 
- namespace protocol {
 
- class ScopedAllowThreadJoinForWebRtcTransport;
 
- }
 
- }
 
- namespace resource_coordinator {
 
- class TabManagerDelegate;
 
- }
 
- namespace service_manager {
 
- class ServiceProcessLauncher;
 
- }
 
- namespace shell_integration_linux {
 
- class LaunchXdgUtilityScopedAllowBaseSyncPrimitives;
 
- }
 
- namespace ui {
 
- class WindowResizeHelperMac;
 
- }
 
- namespace viz {
 
- class HostGpuMemoryBufferManager;
 
- }
 
- namespace vr {
 
- class VrShell;
 
- }
 
- namespace web {
 
- class WebMainLoop;
 
- class WebSubThread;
 
- }
 
- namespace webrtc {
 
- class DesktopConfigurationMonitor;
 
- }
 
- namespace base {
 
- namespace sequence_manager {
 
- namespace internal {
 
- class TaskQueueImpl;
 
- }
 
- }  // namespace sequence_manager
 
- namespace android {
 
- class JavaHandlerThread;
 
- }
 
- namespace internal {
 
- class JobTaskSource;
 
- class TaskTracker;
 
- }
 
- class AdjustOOMScoreHelper;
 
- class FileDescriptorWatcher;
 
- class FilePath;
 
- class GetAppOutputScopedAllowBaseSyncPrimitives;
 
- class ScopedAllowThreadRecallForStackSamplingProfiler;
 
- class SimpleThread;
 
- class StackSamplingProfiler;
 
- class Thread;
 
- class WaitableEvent;
 
- bool PathProviderWin(int, FilePath*);
 
- #if DCHECK_IS_ON()
 
- #define INLINE_IF_DCHECK_IS_OFF BASE_EXPORT
 
- #define EMPTY_BODY_IF_DCHECK_IS_OFF
 
- #else
 
- #define INLINE_IF_DCHECK_IS_OFF inline
 
- // The static_assert() eats follow-on semicolons. `= default` would work
 
- // too, but it makes clang realize that all the Scoped classes are no-ops in
 
- // non-dcheck builds and it starts emitting many -Wunused-variable warnings.
 
- #define EMPTY_BODY_IF_DCHECK_IS_OFF \
 
-   {}                                \
 
-   static_assert(true, "")
 
- #endif
 
- namespace internal {
 
- // Asserts that blocking calls are allowed in the current scope. This is an
 
- // internal call, external code should use ScopedBlockingCall instead, which
 
- // serves as a precise annotation of the scope that may/will block.
 
- INLINE_IF_DCHECK_IS_OFF void AssertBlockingAllowed()
 
-     EMPTY_BODY_IF_DCHECK_IS_OFF;
 
- }  // namespace internal
 
- // Disallows blocking on the current thread.
 
- INLINE_IF_DCHECK_IS_OFF void DisallowBlocking() EMPTY_BODY_IF_DCHECK_IS_OFF;
 
- // Disallows blocking calls within its scope.
 
- class BASE_EXPORT ScopedDisallowBlocking {
 
-  public:
 
-   ScopedDisallowBlocking() EMPTY_BODY_IF_DCHECK_IS_OFF;
 
-   ~ScopedDisallowBlocking() EMPTY_BODY_IF_DCHECK_IS_OFF;
 
-  private:
 
- #if DCHECK_IS_ON()
 
-   const bool was_disallowed_;
 
- #endif
 
-   DISALLOW_COPY_AND_ASSIGN(ScopedDisallowBlocking);
 
- };
 
- class BASE_EXPORT ScopedAllowBlocking {
 
-  private:
 
-   FRIEND_TEST_ALL_PREFIXES(ThreadRestrictionsTest, ScopedAllowBlocking);
 
-   friend class ScopedAllowBlockingForTesting;
 
-   // This can only be instantiated by friends. Use ScopedAllowBlockingForTesting
 
-   // in unit tests to avoid the friend requirement.
 
-   friend class AdjustOOMScoreHelper;
 
-   friend class StackSamplingProfiler;
 
-   friend class android_webview::ScopedAllowInitGLBindings;
 
-   friend class blink::DiskDataAllocator;
 
-   friend class chromeos::MojoUtils;  // http://crbug.com/1055467
 
-   friend class content::BrowserProcessSubThread;
 
-   friend class content::NetworkServiceInstancePrivate;
 
-   friend class content::PepperPrintSettingsManagerImpl;
 
-   friend class content::RenderProcessHostImpl;
 
-   friend class content::RenderWidgetHostViewMac;  // http://crbug.com/121917
 
-   friend class content::WebContentsViewMac;
 
-   friend class cronet::CronetPrefsManager;
 
-   friend class cronet::CronetURLRequestContext;
 
-   friend class memory_instrumentation::OSMetrics;
 
-   friend class metrics::AndroidMetricsServiceClient;
 
-   friend class module_installer::ScopedAllowModulePakLoad;
 
-   friend class mojo::CoreLibraryInitializer;
 
-   friend class printing::LocalPrinterHandlerDefault;
 
-   friend class printing::PrintJobWorker;
 
-   friend class resource_coordinator::TabManagerDelegate;  // crbug.com/778703
 
-   friend class web::WebSubThread;
 
-   friend class weblayer::BrowserContextImpl;
 
-   friend class weblayer::ContentBrowserClientImpl;
 
-   friend class weblayer::ProfileImpl;
 
-   friend class weblayer::WebLayerPathProvider;
 
-   friend bool PathProviderWin(int, FilePath*);
 
-   ScopedAllowBlocking(const Location& from_here = Location::Current());
 
-   ~ScopedAllowBlocking();
 
- #if DCHECK_IS_ON()
 
-   const bool was_disallowed_;
 
- #endif
 
-   DISALLOW_COPY_AND_ASSIGN(ScopedAllowBlocking);
 
- };
 
- class ScopedAllowBlockingForTesting {
 
-  public:
 
-   ScopedAllowBlockingForTesting() {}
 
-   ~ScopedAllowBlockingForTesting() {}
 
-  private:
 
- #if DCHECK_IS_ON()
 
-   ScopedAllowBlocking scoped_allow_blocking_;
 
- #endif
 
-   DISALLOW_COPY_AND_ASSIGN(ScopedAllowBlockingForTesting);
 
- };
 
- INLINE_IF_DCHECK_IS_OFF void DisallowBaseSyncPrimitives()
 
-     EMPTY_BODY_IF_DCHECK_IS_OFF;
 
- class BASE_EXPORT ScopedAllowBaseSyncPrimitives {
 
-  private:
 
-   // This can only be instantiated by friends. Use
 
-   // ScopedAllowBaseSyncPrimitivesForTesting in unit tests to avoid the friend
 
-   // requirement.
 
-   FRIEND_TEST_ALL_PREFIXES(ThreadRestrictionsTest,
 
-                            ScopedAllowBaseSyncPrimitives);
 
-   FRIEND_TEST_ALL_PREFIXES(ThreadRestrictionsTest,
 
-                            ScopedAllowBaseSyncPrimitivesResetsState);
 
-   FRIEND_TEST_ALL_PREFIXES(ThreadRestrictionsTest,
 
-                            ScopedAllowBaseSyncPrimitivesWithBlockingDisallowed);
 
-   // Allowed usage:
 
-   friend class SimpleThread;
 
-   friend class ::ChromeNSSCryptoModuleDelegate;
 
-   friend class base::GetAppOutputScopedAllowBaseSyncPrimitives;
 
-   friend class blink::SourceStream;
 
-   friend class blink::WorkerThread;
 
-   friend class blink::scheduler::WorkerThread;
 
-   friend class chrome_cleaner::SystemReportComponent;
 
-   friend class content::BrowserMainLoop;
 
-   friend class content::BrowserProcessSubThread;
 
-   friend class content::ServiceWorkerContextClient;
 
-   friend class functions::ExecScriptScopedAllowBaseSyncPrimitives;
 
-   friend class history_report::HistoryReportJniBridge;
 
-   friend class internal::TaskTracker;
 
-   friend class leveldb_env::DBTracker;
 
-   friend class location::nearby::chrome::ScheduledExecutor;
 
-   friend class location::nearby::chrome::SubmittableExecutor;
 
-   friend class media::BlockingUrlProtocol;
 
-   friend class mojo::core::ScopedIPCSupport;
 
-   friend class net::MultiThreadedCertVerifierScopedAllowBaseSyncPrimitives;
 
-   friend class rlz_lib::FinancialPing;
 
-   friend class shell_integration_linux::
 
-       LaunchXdgUtilityScopedAllowBaseSyncPrimitives;
 
-   friend class syncer::HttpBridge;
 
-   friend class syncer::GetLocalChangesRequest;
 
-   friend class syncer::ModelSafeWorker;
 
-   friend class webrtc::DesktopConfigurationMonitor;
 
-   // Usage that should be fixed:
 
-   friend class ::NativeBackendKWallet;            // http://crbug.com/125331
 
-   friend class ::chromeos::system::
 
-       StatisticsProviderImpl;                      // http://crbug.com/125385
 
-   friend class blink::VideoFrameResourceProvider;  // http://crbug.com/878070
 
-   ScopedAllowBaseSyncPrimitives() EMPTY_BODY_IF_DCHECK_IS_OFF;
 
-   ~ScopedAllowBaseSyncPrimitives() EMPTY_BODY_IF_DCHECK_IS_OFF;
 
- #if DCHECK_IS_ON()
 
-   const bool was_disallowed_;
 
- #endif
 
-   DISALLOW_COPY_AND_ASSIGN(ScopedAllowBaseSyncPrimitives);
 
- };
 
- class BASE_EXPORT ScopedAllowBaseSyncPrimitivesOutsideBlockingScope {
 
-  private:
 
-   // This can only be instantiated by friends. Use
 
-   // ScopedAllowBaseSyncPrimitivesForTesting in unit tests to avoid the friend
 
-   // requirement.
 
-   FRIEND_TEST_ALL_PREFIXES(ThreadRestrictionsTest,
 
-                            ScopedAllowBaseSyncPrimitivesOutsideBlockingScope);
 
-   FRIEND_TEST_ALL_PREFIXES(
 
-       ThreadRestrictionsTest,
 
-       ScopedAllowBaseSyncPrimitivesOutsideBlockingScopeResetsState);
 
-   // Allowed usage:
 
-   friend class ::BrowserProcessImpl;  // http://crbug.com/125207
 
-   friend class ::KeyStorageLinux;
 
-   friend class ::NativeDesktopMediaList;
 
-   friend class android::JavaHandlerThread;
 
-   friend class android_webview::
 
-       AwFormDatabaseService;  // http://crbug.com/904431
 
-   friend class android_webview::CookieManager;
 
-   friend class android_webview::VizCompositorThreadRunnerWebView;
 
-   friend class audio::OutputDevice;
 
-   friend class base::sequence_manager::internal::TaskQueueImpl;
 
-   friend class base::FileDescriptorWatcher;
 
-   friend class base::internal::JobTaskSource;
 
-   friend class base::ScopedAllowThreadRecallForStackSamplingProfiler;
 
-   friend class base::StackSamplingProfiler;
 
-   friend class blink::RTCVideoDecoderAdapter;
 
-   friend class blink::RTCVideoEncoder;
 
-   friend class cc::TileTaskManagerImpl;
 
-   friend class content::CategorizedWorkerPool;
 
-   friend class content::DesktopCaptureDevice;
 
-   friend class content::InProcessUtilityThread;
 
-   friend class content::RTCVideoDecoder;
 
-   friend class content::SandboxHostLinux;
 
-   friend class content::ScopedAllowWaitForDebugURL;
 
-   friend class content::SynchronousCompositor;
 
-   friend class content::SynchronousCompositorHost;
 
-   friend class content::SynchronousCompositorSyncCallBridge;
 
-   friend class content::WaitForProcessesToDumpProfilingInfo;
 
-   friend class media::AudioInputDevice;
 
-   friend class media::AudioOutputDevice;
 
-   friend class media::PaintCanvasVideoRenderer;
 
-   friend class mojo::SyncCallRestrictions;
 
-   friend class net::NetworkConfigWatcherMacThread;
 
-   friend class ui::DrmThreadProxy;
 
-   friend class viz::HostGpuMemoryBufferManager;
 
-   friend class vr::VrShell;
 
-   // Usage that should be fixed:
 
-   friend class ::chromeos::BlockingMethodCaller;  // http://crbug.com/125360
 
-   friend class base::Thread;                      // http://crbug.com/918039
 
-   friend class cc::CompletionEvent;               // http://crbug.com/902653
 
-   friend class content::
 
-       BrowserGpuChannelHostFactory;                 // http://crbug.com/125248
 
-   friend class dbus::Bus;                           // http://crbug.com/125222
 
-   friend class disk_cache::BackendImpl;             // http://crbug.com/74623
 
-   friend class disk_cache::InFlightIO;              // http://crbug.com/74623
 
-   friend class gpu::GpuChannelHost;                 // http://crbug.com/125264
 
-   friend class remoting::protocol::
 
-       ScopedAllowThreadJoinForWebRtcTransport;      // http://crbug.com/660081
 
-   friend class midi::TaskService;                   // https://crbug.com/796830
 
-   friend class net::internal::AddressTrackerLinux;  // http://crbug.com/125097
 
-   friend class net::
 
-       MultiThreadedProxyResolverScopedAllowJoinOnIO;  // http://crbug.com/69710
 
-   friend class net::NetworkChangeNotifierMac;         // http://crbug.com/125097
 
-   friend class printing::PrinterQuery;                 // http://crbug.com/66082
 
-   friend class proxy_resolver::
 
-       ScopedAllowThreadJoinForProxyResolverV8Tracing;  // http://crbug.com/69710
 
-   friend class remoting::AutoThread;  // https://crbug.com/944316
 
-   // Not used in production yet, https://crbug.com/844078.
 
-   friend class service_manager::ServiceProcessLauncher;
 
-   friend class ui::WindowResizeHelperMac;  // http://crbug.com/902829
 
-   friend class content::TextInputClientMac;  // http://crbug.com/121917
 
-   ScopedAllowBaseSyncPrimitivesOutsideBlockingScope(
 
-       const Location& from_here = Location::Current());
 
-   ~ScopedAllowBaseSyncPrimitivesOutsideBlockingScope();
 
- #if DCHECK_IS_ON()
 
-   const bool was_disallowed_;
 
- #endif
 
-   // Since this object is used to indicate that sync primitives will be used to
 
-   // wait for an event ignore the current operation for hang watching purposes
 
-   // since the wait time duration is unknown.
 
-   base::HangWatchScopeDisabled hang_watch_scope_disabled_;
 
-   DISALLOW_COPY_AND_ASSIGN(ScopedAllowBaseSyncPrimitivesOutsideBlockingScope);
 
- };
 
- // Allow base-sync-primitives in tests, doesn't require explicit friend'ing like
 
- // ScopedAllowBaseSyncPrimitives-types aimed at production do.
 
- // Note: For WaitableEvents in the test logic, base::TestWaitableEvent is
 
- // exposed as a convenience to avoid the need for
 
- // ScopedAllowBaseSyncPrimitivesForTesting.
 
- class BASE_EXPORT ScopedAllowBaseSyncPrimitivesForTesting {
 
-  public:
 
-   ScopedAllowBaseSyncPrimitivesForTesting() EMPTY_BODY_IF_DCHECK_IS_OFF;
 
-   ~ScopedAllowBaseSyncPrimitivesForTesting() EMPTY_BODY_IF_DCHECK_IS_OFF;
 
-  private:
 
- #if DCHECK_IS_ON()
 
-   const bool was_disallowed_;
 
- #endif
 
-   DISALLOW_COPY_AND_ASSIGN(ScopedAllowBaseSyncPrimitivesForTesting);
 
- };
 
- // Counterpart to base::DisallowUnresponsiveTasks() for tests to allow them to
 
- // block their thread after it was banned.
 
- class BASE_EXPORT ScopedAllowUnresponsiveTasksForTesting {
 
-  public:
 
-   ScopedAllowUnresponsiveTasksForTesting() EMPTY_BODY_IF_DCHECK_IS_OFF;
 
-   ~ScopedAllowUnresponsiveTasksForTesting() EMPTY_BODY_IF_DCHECK_IS_OFF;
 
-  private:
 
- #if DCHECK_IS_ON()
 
-   const bool was_disallowed_base_sync_;
 
-   const bool was_disallowed_blocking_;
 
-   const bool was_disallowed_cpu_;
 
- #endif
 
-   DISALLOW_COPY_AND_ASSIGN(ScopedAllowUnresponsiveTasksForTesting);
 
- };
 
- namespace internal {
 
- // Asserts that waiting on a //base sync primitive is allowed in the current
 
- // scope.
 
- INLINE_IF_DCHECK_IS_OFF void AssertBaseSyncPrimitivesAllowed()
 
-     EMPTY_BODY_IF_DCHECK_IS_OFF;
 
- // Resets all thread restrictions on the current thread.
 
- INLINE_IF_DCHECK_IS_OFF void ResetThreadRestrictionsForTesting()
 
-     EMPTY_BODY_IF_DCHECK_IS_OFF;
 
- }  // namespace internal
 
- // Asserts that running long CPU work is allowed in the current scope.
 
- INLINE_IF_DCHECK_IS_OFF void AssertLongCPUWorkAllowed()
 
-     EMPTY_BODY_IF_DCHECK_IS_OFF;
 
- INLINE_IF_DCHECK_IS_OFF void DisallowUnresponsiveTasks()
 
-     EMPTY_BODY_IF_DCHECK_IS_OFF;
 
- class BASE_EXPORT ThreadRestrictions {
 
-  public:
 
-   // Constructing a ScopedAllowIO temporarily allows IO for the current
 
-   // thread.  Doing this is almost certainly always incorrect.
 
-   //
 
-   // DEPRECATED. Use ScopedAllowBlocking(ForTesting).
 
-   class BASE_EXPORT ScopedAllowIO {
 
-    public:
 
-     ScopedAllowIO(const Location& from_here = Location::Current());
 
-     ~ScopedAllowIO();
 
-    private:
 
- #if DCHECK_IS_ON()
 
-     const bool was_allowed_;
 
- #endif
 
-     DISALLOW_COPY_AND_ASSIGN(ScopedAllowIO);
 
-   };
 
- #if DCHECK_IS_ON()
 
-   // Set whether the current thread to make IO calls.
 
-   // Threads start out in the *allowed* state.
 
-   // Returns the previous value.
 
-   //
 
-   // DEPRECATED. Use ScopedAllowBlocking(ForTesting) or ScopedDisallowBlocking.
 
-   static bool SetIOAllowed(bool allowed);
 
-   // Set whether the current thread can use singletons.  Returns the previous
 
-   // value.
 
-   static bool SetSingletonAllowed(bool allowed);
 
-   // Check whether the current thread is allowed to use singletons (Singleton /
 
-   // LazyInstance).  DCHECKs if not.
 
-   static void AssertSingletonAllowed();
 
-   // Disable waiting on the current thread. Threads start out in the *allowed*
 
-   // state. Returns the previous value.
 
-   //
 
-   // DEPRECATED. Use DisallowBaseSyncPrimitives.
 
-   static void DisallowWaiting();
 
- #else
 
-   // Inline the empty definitions of these functions so that they can be
 
-   // compiled out.
 
-   static bool SetIOAllowed(bool allowed) { return true; }
 
-   static bool SetSingletonAllowed(bool allowed) { return true; }
 
-   static void AssertSingletonAllowed() {}
 
-   static void DisallowWaiting() {}
 
- #endif
 
-  private:
 
-   // DO NOT ADD ANY OTHER FRIEND STATEMENTS.
 
-   // BEGIN ALLOWED USAGE.
 
-   friend class content::BrowserMainLoop;
 
-   friend class content::BrowserShutdownProfileDumper;
 
-   friend class content::BrowserTestBase;
 
-   friend class content::ScopedAllowWaitForDebugURL;
 
-   friend class ::HistogramSynchronizer;
 
-   friend class internal::TaskTracker;
 
-   friend class web::WebMainLoop;
 
-   friend class MessagePumpDefault;
 
-   friend class PlatformThread;
 
-   friend class ui::CommandBufferClientImpl;
 
-   friend class ui::CommandBufferLocal;
 
-   friend class ui::GpuState;
 
-   // END ALLOWED USAGE.
 
-   // BEGIN USAGE THAT NEEDS TO BE FIXED.
 
-   friend class chrome_browser_net::Predictor;     // http://crbug.com/78451
 
- #if !defined(OFFICIAL_BUILD)
 
-   friend class content::SoftwareOutputDeviceMus;  // Interim non-production code
 
- #endif
 
- // END USAGE THAT NEEDS TO BE FIXED.
 
- #if DCHECK_IS_ON()
 
-   // DEPRECATED. Use ScopedAllowBaseSyncPrimitives.
 
-   static bool SetWaitAllowed(bool allowed);
 
- #else
 
-   static bool SetWaitAllowed(bool allowed) { return true; }
 
- #endif
 
-   DISALLOW_IMPLICIT_CONSTRUCTORS(ThreadRestrictions);
 
- };
 
- #undef INLINE_IF_DCHECK_IS_OFF
 
- #undef EMPTY_BODY_IF_DCHECK_IS_OFF
 
- }  // namespace base
 
- #endif  // BASE_THREADING_THREAD_RESTRICTIONS_H_
 
 
  |