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