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