// 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 CONTENT_BROWSER_BROWSER_PROCESS_SUB_THREAD_H_ #define CONTENT_BROWSER_BROWSER_PROCESS_SUB_THREAD_H_ #include #include "base/macros.h" #include "base/threading/thread.h" #include "base/threading/thread_checker.h" #include "build/build_config.h" #include "content/common/content_export.h" #include "content/public/browser/browser_thread.h" #if defined(OS_WIN) namespace base { namespace win { class ScopedCOMInitializer; } } #endif namespace content { class NotificationService; } namespace content { // ---------------------------------------------------------------------------- // A BrowserProcessSubThread is a physical thread backing a BrowserThread. // // Applications must initialize the COM library before they can call // COM library functions other than CoGetMalloc and memory allocation // functions, so this class initializes COM for those users. class CONTENT_EXPORT BrowserProcessSubThread : public base::Thread { public: // Constructs a BrowserProcessSubThread for |identifier|. explicit BrowserProcessSubThread(BrowserThread::ID identifier); ~BrowserProcessSubThread() override; // Registers this thread to represent |identifier_| in the browser_thread.h // API. This thread must already be running when this is called. This can only // be called once per BrowserProcessSubThread instance. void RegisterAsBrowserThread(); // Ideally there wouldn't be a special blanket allowance to block the // BrowserThreads in tests but TestBrowserThreadImpl previously bypassed // BrowserProcessSubThread and hence wasn't subject to ThreadRestrictions... // Flipping that around in favor of explicit scoped allowances would be // preferable but a non-trivial amount of work. Can only be called before // starting this BrowserProcessSubThread. void AllowBlockingForTesting(); protected: void Init() override; void Run(base::RunLoop* run_loop) override; void CleanUp() override; private: // Second Init() phase that must happen on this thread but can only happen // after it's promoted to a BrowserThread in |RegisterAsBrowserThread()|. void CompleteInitializationOnBrowserThread(); // These methods merely forwards to Thread::Run() but are useful to identify // which BrowserThread this represents in stack traces. void UIThreadRun(base::RunLoop* run_loop); void IOThreadRun(base::RunLoop* run_loop); // This method encapsulates cleanup that needs to happen on the IO thread. void IOThreadCleanUp(); const BrowserThread::ID identifier_; // BrowserThreads are not allowed to do file I/O nor wait on synchronization // primivives except when explicitly allowed in tests. bool is_blocking_allowed_for_testing_ = false; // The BrowserThread registration for this |identifier_|, initialized in // RegisterAsBrowserThread(). std::unique_ptr browser_thread_; #if defined (OS_WIN) std::unique_ptr com_initializer_; #endif // Each specialized thread has its own notification service. std::unique_ptr notification_service_; THREAD_CHECKER(browser_thread_checker_); DISALLOW_COPY_AND_ASSIGN(BrowserProcessSubThread); }; } // namespace content #endif // CONTENT_BROWSER_BROWSER_PROCESS_SUB_THREAD_H_