thread_restrictions.h revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_THREADING_THREAD_RESTRICTIONS_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_THREADING_THREAD_RESTRICTIONS_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_export.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See comment at top of thread_checker.h 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENABLE_THREAD_RESTRICTIONS 1 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ENABLE_THREAD_RESTRICTIONS 0 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AcceleratedPresenter; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserProcessImpl; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistogramSynchronizer; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NativeBackendKWallet; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedAllowWaitForLegacyWebViewApi; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestingAutomationProvider; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace browser_sync { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NonFrontendDataTypeController; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UIModelWorker; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cc { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CompletionEvent; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AudioMixerAlsa; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BlockingMethodCaller; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace system { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StatisticsProviderImpl; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome_browser_net { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Predictor; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserGpuChannelHostFactory; 44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class BrowserShutdownProfileDumper; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BrowserTestBase; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLHelper; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuChannelHost; 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class NestedMessagePumpAndroid; 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass RenderWidgetResizeHelper; 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass ScopedAllowWaitForAndroidLayoutTests; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TextInputClientMac; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace dbus { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Bus; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace disk_cache { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BackendImpl; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InFlightIO; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AudioOutputController; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace metrics { 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass MetricsService; 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace mojo { 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace common { 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class WatcherThreadManager; 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileStreamPosix; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileStreamWin; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace internal { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AddressTrackerLinux; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutoThread; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochnamespace android { 86bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass JavaHandlerThread; 87bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 88bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SequencedWorkerPool; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SimpleThread; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Thread; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ThreadTestHelper; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Certain behavior is disallowed on certain threads. ThreadRestrictions helps 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// enforce these rules. Examples of such rules: 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Do not do blocking IO (makes the thread janky) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Do not access Singleton/LazyInstance (may lead to shutdown crashes) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Here's more about how the protection works: 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1) If a thread should not be allowed to make IO calls, mark it: 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::ThreadRestrictions::SetIOAllowed(false); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// By default, threads *are* allowed to make IO calls. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In Chrome browser code, IO calls should be proxied to the File thread. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2) If a function makes a call that will go out to disk, check whether the 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// current thread is allowed: 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::ThreadRestrictions::AssertIOAllowed(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Style tip: where should you put AssertIOAllowed checks? It's best 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if you put them as close to the disk access as possible, at the 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// lowest level. This rule is simple to follow and helps catch all 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// callers. For example, if your function GoDoSomeBlockingDiskCall() 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// only calls other functions in Chrome and not fopen(), you should go 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// add the AssertIOAllowed checks in the helper functions. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT ThreadRestrictions { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructing a ScopedAllowIO temporarily allows IO for the current 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thread. Doing this is almost certainly always incorrect. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class BASE_EXPORT ScopedAllowIO { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedAllowIO() { previous_value_ = SetIOAllowed(true); } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedAllowIO() { SetIOAllowed(previous_value_); } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether IO is allowed when the ScopedAllowIO was constructed. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool previous_value_; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedAllowIO); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructing a ScopedAllowSingleton temporarily allows accessing for the 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current thread. Doing this is almost always incorrect. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class BASE_EXPORT ScopedAllowSingleton { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedAllowSingleton() { previous_value_ = SetSingletonAllowed(true); } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedAllowSingleton() { SetSingletonAllowed(previous_value_); } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether singleton use is allowed when the ScopedAllowSingleton was 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // constructed. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool previous_value_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedAllowSingleton); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if ENABLE_THREAD_RESTRICTIONS 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set whether the current thread to make IO calls. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Threads start out in the *allowed* state. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the previous value. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SetIOAllowed(bool allowed); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check whether the current thread is allowed to make IO calls, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and DCHECK if not. See the block comment above the class for 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a discussion of where to add these checks. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void AssertIOAllowed(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set whether the current thread can use singletons. Returns the previous 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // value. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SetSingletonAllowed(bool allowed); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check whether the current thread is allowed to use singletons (Singleton / 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LazyInstance). DCHECKs if not. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void AssertSingletonAllowed(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable waiting on the current thread. Threads start out in the *allowed* 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // state. Returns the previous value. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void DisallowWaiting(); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check whether the current thread is allowed to wait, and DCHECK if not. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void AssertWaitAllowed(); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inline the empty definitions of these functions so that they can be 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compiled out. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SetIOAllowed(bool allowed) { return true; } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void AssertIOAllowed() {} 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SetSingletonAllowed(bool allowed) { return true; } 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void AssertSingletonAllowed() {} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void DisallowWaiting() {} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void AssertWaitAllowed() {} 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DO NOT ADD ANY OTHER FRIEND STATEMENTS, talk to jam or brettw first. 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BEGIN ALLOWED USAGE. 187d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) friend class content::BrowserShutdownProfileDumper; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class content::BrowserTestBase; 18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) friend class content::NestedMessagePumpAndroid; 190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch friend class content::RenderWidgetResizeHelper; 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch friend class content::ScopedAllowWaitForAndroidLayoutTests; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::HistogramSynchronizer; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::ScopedAllowWaitForLegacyWebViewApi; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::TestingAutomationProvider; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class cc::CompletionEvent; 1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) friend class mojo::common::WatcherThreadManager; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class remoting::AutoThread; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class MessagePumpDefault; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class SequencedWorkerPool; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class SimpleThread; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class Thread; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ThreadTestHelper; 20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) friend class PlatformThread; 204bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch friend class android::JavaHandlerThread; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // END ALLOWED USAGE. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BEGIN USAGE THAT NEEDS TO BE FIXED. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::chromeos::AudioMixerAlsa; // http://crbug.com/125206 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::chromeos::BlockingMethodCaller; // http://crbug.com/125360 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::chromeos::system::StatisticsProviderImpl; // http://crbug.com/125385 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class browser_sync::NonFrontendDataTypeController; // http://crbug.com/19757 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class browser_sync::UIModelWorker; // http://crbug.com/19757 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class chrome_browser_net::Predictor; // http://crbug.com/78451 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserGpuChannelHostFactory; // http://crbug.com/125248 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class content::GLHelper; // http://crbug.com/125415 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class content::GpuChannelHost; // http://crbug.com/125264 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class content::TextInputClientMac; // http://crbug.com/121917 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class dbus::Bus; // http://crbug.com/125222 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class disk_cache::BackendImpl; // http://crbug.com/74623 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class disk_cache::InFlightIO; // http://crbug.com/74623 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class media::AudioOutputController; // http://crbug.com/120973 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class net::FileStreamPosix; // http://crbug.com/115067 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class net::FileStreamWin; // http://crbug.com/115067 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class net::internal::AddressTrackerLinux; // http://crbug.com/125097 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::AcceleratedPresenter; // http://crbug.com/125391 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::BrowserProcessImpl; // http://crbug.com/125207 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci friend class metrics::MetricsService; // http://crbug.com/124954 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::NativeBackendKWallet; // http://crbug.com/125331 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // END USAGE THAT NEEDS TO BE FIXED. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if ENABLE_THREAD_RESTRICTIONS 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SetWaitAllowed(bool allowed); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SetWaitAllowed(bool allowed) { return true; } 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructing a ScopedAllowWait temporarily allows waiting on the current 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thread. Doing this is almost always incorrect, which is why we limit who 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can use this through friend. If you find yourself needing to use this, find 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // another way. Talk to jam or brettw. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class BASE_EXPORT ScopedAllowWait { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedAllowWait() { previous_value_ = SetWaitAllowed(true); } 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedAllowWait() { SetWaitAllowed(previous_value_); } 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether singleton use is allowed when the ScopedAllowWait was 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // constructed. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool previous_value_; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedAllowWait); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_IMPLICIT_CONSTRUCTORS(ThreadRestrictions); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // BASE_THREADING_THREAD_RESTRICTIONS_H_ 260