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 CONTENT_BROWSER_BROWSER_THREAD_IMPL_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_BROWSER_BROWSER_THREAD_IMPL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CONTENT_EXPORT BrowserThreadImpl : public BrowserThread, 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public base::Thread { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct a BrowserThreadImpl with the supplied identifier. It is an error 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to construct a BrowserThreadImpl that already exists. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit BrowserThreadImpl(BrowserThread::ID identifier); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Special constructor for the main (UI) thread and unittests. If a 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // |message_loop| is provied, we use a dummy thread here since the main 23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // thread already exists. 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserThreadImpl(BrowserThread::ID identifier, 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop* message_loop); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BrowserThreadImpl(); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ShutdownThreadPool(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Init() OVERRIDE; 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Run(base::MessageLoop* message_loop) OVERRIDE; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CleanUp() OVERRIDE; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We implement all the functionality of the public BrowserThread 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // functions, but state is stored in the BrowserThreadImpl to keep 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the API cleaner. Therefore make BrowserThread a friend class. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class BrowserThread; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The following are unique function names that makes it possible to tell 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the thread id from the callstack alone in crash dumps. 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void UIThreadRun(base::MessageLoop* message_loop); 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void DBThreadRun(base::MessageLoop* message_loop); 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void FileThreadRun(base::MessageLoop* message_loop); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void FileUserBlockingThreadRun(base::MessageLoop* message_loop); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ProcessLauncherThreadRun(base::MessageLoop* message_loop); 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void CacheThreadRun(base::MessageLoop* message_loop); 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void IOThreadRun(base::MessageLoop* message_loop); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool PostTaskHelper( 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::ID identifier, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location& from_here, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& task, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta delay, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool nestable); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Common initialization code for the constructors. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Initialize(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For testing. 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class ContentTestSuiteBaseListener; 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) friend class TestBrowserThreadBundle; 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static void FlushThreadPoolHelperForTesting(); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The identifier of this thread. Only one thread can exist with a given 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // identifier at a given time. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID identifier_; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_BROWSER_BROWSER_THREAD_IMPL_H_ 74