thread_restrictions.h revision 58537e28ecd584eab876aee8be7156509866d23a
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 MetricsService; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NativeBackendKWallet; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedAllowWaitForLegacyWebViewApi; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestingAutomationProvider; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace browser_sync { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NonFrontendDataTypeController; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UIModelWorker; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cc { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CompletionEvent; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AudioMixerAlsa; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BlockingMethodCaller; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace system { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StatisticsProviderImpl; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome_browser_net { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Predictor; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserGpuChannelHostFactory; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BrowserTestBase; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLHelper; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuChannelHost; 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class NestedMessagePumpAndroid; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderWidgetHelper; 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)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileStreamPosix; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileStreamWin; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace internal { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AddressTrackerLinux; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutoThread; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 77bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochnamespace android { 78bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass JavaHandlerThread; 79bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 80bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SequencedWorkerPool; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SimpleThread; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Thread; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ThreadTestHelper; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Certain behavior is disallowed on certain threads. ThreadRestrictions helps 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// enforce these rules. Examples of such rules: 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Do not do blocking IO (makes the thread janky) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Do not access Singleton/LazyInstance (may lead to shutdown crashes) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Here's more about how the protection works: 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1) If a thread should not be allowed to make IO calls, mark it: 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::ThreadRestrictions::SetIOAllowed(false); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// By default, threads *are* allowed to make IO calls. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In Chrome browser code, IO calls should be proxied to the File thread. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2) If a function makes a call that will go out to disk, check whether the 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// current thread is allowed: 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::ThreadRestrictions::AssertIOAllowed(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Style tip: where should you put AssertIOAllowed checks? It's best 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if you put them as close to the disk access as possible, at the 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// lowest level. This rule is simple to follow and helps catch all 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// callers. For example, if your function GoDoSomeBlockingDiskCall() 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// only calls other functions in Chrome and not fopen(), you should go 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// add the AssertIOAllowed checks in the helper functions. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT ThreadRestrictions { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructing a ScopedAllowIO temporarily allows IO for the current 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thread. Doing this is almost certainly always incorrect. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class BASE_EXPORT ScopedAllowIO { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedAllowIO() { previous_value_ = SetIOAllowed(true); } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedAllowIO() { SetIOAllowed(previous_value_); } 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether IO is allowed when the ScopedAllowIO was constructed. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool previous_value_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedAllowIO); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructing a ScopedAllowSingleton temporarily allows accessing for the 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current thread. Doing this is almost always incorrect. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class BASE_EXPORT ScopedAllowSingleton { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedAllowSingleton() { previous_value_ = SetSingletonAllowed(true); } 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedAllowSingleton() { SetSingletonAllowed(previous_value_); } 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether singleton use is allowed when the ScopedAllowSingleton was 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // constructed. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool previous_value_; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedAllowSingleton); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if ENABLE_THREAD_RESTRICTIONS 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set whether the current thread to make IO calls. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Threads start out in the *allowed* state. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the previous value. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SetIOAllowed(bool allowed); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check whether the current thread is allowed to make IO calls, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and DCHECK if not. See the block comment above the class for 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a discussion of where to add these checks. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void AssertIOAllowed(); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set whether the current thread can use singletons. Returns the previous 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // value. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SetSingletonAllowed(bool allowed); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check whether the current thread is allowed to use singletons (Singleton / 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LazyInstance). DCHECKs if not. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void AssertSingletonAllowed(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable waiting on the current thread. Threads start out in the *allowed* 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // state. Returns the previous value. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void DisallowWaiting(); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check whether the current thread is allowed to wait, and DCHECK if not. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void AssertWaitAllowed(); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inline the empty definitions of these functions so that they can be 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compiled out. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SetIOAllowed(bool allowed) { return true; } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void AssertIOAllowed() {} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SetSingletonAllowed(bool allowed) { return true; } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void AssertSingletonAllowed() {} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void DisallowWaiting() {} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void AssertWaitAllowed() {} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DO NOT ADD ANY OTHER FRIEND STATEMENTS, talk to jam or brettw first. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BEGIN ALLOWED USAGE. 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class content::BrowserTestBase; 18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) friend class content::NestedMessagePumpAndroid; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class content::RenderWidgetHelper; 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch friend class content::ScopedAllowWaitForAndroidLayoutTests; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::HistogramSynchronizer; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::ScopedAllowWaitForLegacyWebViewApi; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::TestingAutomationProvider; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class cc::CompletionEvent; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class remoting::AutoThread; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class MessagePumpDefault; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class SequencedWorkerPool; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class SimpleThread; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class Thread; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ThreadTestHelper; 19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) friend class PlatformThread; 194bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch friend class android::JavaHandlerThread; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // END ALLOWED USAGE. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BEGIN USAGE THAT NEEDS TO BE FIXED. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::chromeos::AudioMixerAlsa; // http://crbug.com/125206 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::chromeos::BlockingMethodCaller; // http://crbug.com/125360 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::chromeos::system::StatisticsProviderImpl; // http://crbug.com/125385 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class browser_sync::NonFrontendDataTypeController; // http://crbug.com/19757 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class browser_sync::UIModelWorker; // http://crbug.com/19757 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class chrome_browser_net::Predictor; // http://crbug.com/78451 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserGpuChannelHostFactory; // http://crbug.com/125248 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class content::GLHelper; // http://crbug.com/125415 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class content::GpuChannelHost; // http://crbug.com/125264 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class content::TextInputClientMac; // http://crbug.com/121917 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class dbus::Bus; // http://crbug.com/125222 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class disk_cache::BackendImpl; // http://crbug.com/74623 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class disk_cache::InFlightIO; // http://crbug.com/74623 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class media::AudioOutputController; // http://crbug.com/120973 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class net::FileStreamPosix; // http://crbug.com/115067 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class net::FileStreamWin; // http://crbug.com/115067 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class net::internal::AddressTrackerLinux; // http://crbug.com/125097 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::AcceleratedPresenter; // http://crbug.com/125391 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::BrowserProcessImpl; // http://crbug.com/125207 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::MetricsService; // http://crbug.com/124954 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ::NativeBackendKWallet; // http://crbug.com/125331 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // END USAGE THAT NEEDS TO BE FIXED. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if ENABLE_THREAD_RESTRICTIONS 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SetWaitAllowed(bool allowed); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SetWaitAllowed(bool allowed) { return true; } 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructing a ScopedAllowWait temporarily allows waiting on the current 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thread. Doing this is almost always incorrect, which is why we limit who 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can use this through friend. If you find yourself needing to use this, find 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // another way. Talk to jam or brettw. 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class BASE_EXPORT ScopedAllowWait { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedAllowWait() { previous_value_ = SetWaitAllowed(true); } 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedAllowWait() { SetWaitAllowed(previous_value_); } 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether singleton use is allowed when the ScopedAllowWait was 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // constructed. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool previous_value_; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedAllowWait); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_IMPLICIT_CONSTRUCTORS(ThreadRestrictions); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // BASE_THREADING_THREAD_RESTRICTIONS_H_ 250