| Index: content/browser/browser_thread.cc
|
| diff --git a/content/browser/browser_thread.cc b/content/browser/browser_thread.cc
|
| deleted file mode 100644
|
| index c3b400540e8d8897a68ea7cccccd4340f4b65908..0000000000000000000000000000000000000000
|
| --- a/content/browser/browser_thread.cc
|
| +++ /dev/null
|
| @@ -1,340 +0,0 @@
|
| -// Copyright (c) 2011 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.
|
| -
|
| -#include "content/browser/browser_thread.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/message_loop.h"
|
| -#include "base/message_loop_proxy.h"
|
| -#include "base/threading/thread_restrictions.h"
|
| -
|
| -// Friendly names for the well-known threads.
|
| -static const char* browser_thread_names[BrowserThread::ID_COUNT] = {
|
| - "", // UI (name assembled in browser_main.cc).
|
| - "Chrome_DBThread", // DB
|
| - "Chrome_WebKitThread", // WEBKIT
|
| - "Chrome_FileThread", // FILE
|
| - "Chrome_ProcessLauncherThread", // PROCESS_LAUNCHER
|
| - "Chrome_CacheThread", // CACHE
|
| - "Chrome_IOThread", // IO
|
| -#if defined(OS_CHROMEOS)
|
| - "Chrome_WebSocketproxyThread", // WEB_SOCKET_PROXY
|
| -#endif
|
| -};
|
| -
|
| -// An implementation of MessageLoopProxy to be used in conjunction
|
| -// with BrowserThread.
|
| -class BrowserThreadMessageLoopProxy : public base::MessageLoopProxy {
|
| - public:
|
| - explicit BrowserThreadMessageLoopProxy(BrowserThread::ID identifier)
|
| - : id_(identifier) {
|
| - }
|
| -
|
| - // MessageLoopProxy implementation.
|
| - virtual bool PostTask(const tracked_objects::Location& from_here,
|
| - Task* task) {
|
| - return BrowserThread::PostTask(id_, from_here, task);
|
| - }
|
| -
|
| - virtual bool PostDelayedTask(const tracked_objects::Location& from_here,
|
| - Task* task, int64 delay_ms) {
|
| - return BrowserThread::PostDelayedTask(id_, from_here, task, delay_ms);
|
| - }
|
| -
|
| - virtual bool PostNonNestableTask(const tracked_objects::Location& from_here,
|
| - Task* task) {
|
| - return BrowserThread::PostNonNestableTask(id_, from_here, task);
|
| - }
|
| -
|
| - virtual bool PostNonNestableDelayedTask(
|
| - const tracked_objects::Location& from_here,
|
| - Task* task,
|
| - int64 delay_ms) {
|
| - return BrowserThread::PostNonNestableDelayedTask(id_, from_here, task,
|
| - delay_ms);
|
| - }
|
| -
|
| - virtual bool PostTask(const tracked_objects::Location& from_here,
|
| - const base::Closure& task) {
|
| - return BrowserThread::PostTask(id_, from_here, task);
|
| - }
|
| -
|
| - virtual bool PostDelayedTask(const tracked_objects::Location& from_here,
|
| - const base::Closure& task, int64 delay_ms) {
|
| - return BrowserThread::PostDelayedTask(id_, from_here, task, delay_ms);
|
| - }
|
| -
|
| - virtual bool PostNonNestableTask(const tracked_objects::Location& from_here,
|
| - const base::Closure& task) {
|
| - return BrowserThread::PostNonNestableTask(id_, from_here, task);
|
| - }
|
| -
|
| - virtual bool PostNonNestableDelayedTask(
|
| - const tracked_objects::Location& from_here,
|
| - const base::Closure& task,
|
| - int64 delay_ms) {
|
| - return BrowserThread::PostNonNestableDelayedTask(id_, from_here, task,
|
| - delay_ms);
|
| - }
|
| -
|
| - virtual bool BelongsToCurrentThread() {
|
| - return BrowserThread::CurrentlyOn(id_);
|
| - }
|
| -
|
| - private:
|
| - BrowserThread::ID id_;
|
| - DISALLOW_COPY_AND_ASSIGN(BrowserThreadMessageLoopProxy);
|
| -};
|
| -
|
| -
|
| -base::Lock BrowserThread::lock_;
|
| -
|
| -BrowserThread* BrowserThread::browser_threads_[ID_COUNT];
|
| -
|
| -BrowserThread::BrowserThread(BrowserThread::ID identifier)
|
| - : Thread(browser_thread_names[identifier]),
|
| - identifier_(identifier) {
|
| - Initialize();
|
| -}
|
| -
|
| -BrowserThread::BrowserThread(ID identifier, MessageLoop* message_loop)
|
| - : Thread(message_loop->thread_name().c_str()),
|
| - identifier_(identifier) {
|
| - set_message_loop(message_loop);
|
| - Initialize();
|
| -}
|
| -
|
| -void BrowserThread::Initialize() {
|
| - base::AutoLock lock(lock_);
|
| - DCHECK(identifier_ >= 0 && identifier_ < ID_COUNT);
|
| - DCHECK(browser_threads_[identifier_] == NULL);
|
| - browser_threads_[identifier_] = this;
|
| -}
|
| -
|
| -BrowserThread::~BrowserThread() {
|
| - // Stop the thread here, instead of the parent's class destructor. This is so
|
| - // that if there are pending tasks that run, code that checks that it's on the
|
| - // correct BrowserThread succeeds.
|
| - Stop();
|
| -
|
| - base::AutoLock lock(lock_);
|
| - browser_threads_[identifier_] = NULL;
|
| -#ifndef NDEBUG
|
| - // Double check that the threads are ordered correctly in the enumeration.
|
| - for (int i = identifier_ + 1; i < ID_COUNT; ++i) {
|
| - DCHECK(!browser_threads_[i]) <<
|
| - "Threads must be listed in the reverse order that they die";
|
| - }
|
| -#endif
|
| -}
|
| -
|
| -// static
|
| -bool BrowserThread::IsWellKnownThread(ID identifier) {
|
| - base::AutoLock lock(lock_);
|
| - return (identifier >= 0 && identifier < ID_COUNT &&
|
| - browser_threads_[identifier]);
|
| -}
|
| -
|
| -// static
|
| -bool BrowserThread::CurrentlyOn(ID identifier) {
|
| - // We shouldn't use MessageLoop::current() since it uses LazyInstance which
|
| - // may be deleted by ~AtExitManager when a WorkerPool thread calls this
|
| - // function.
|
| - // http://crbug.com/63678
|
| - base::ThreadRestrictions::ScopedAllowSingleton allow_singleton;
|
| - base::AutoLock lock(lock_);
|
| - DCHECK(identifier >= 0 && identifier < ID_COUNT);
|
| - return browser_threads_[identifier] &&
|
| - browser_threads_[identifier]->message_loop() == MessageLoop::current();
|
| -}
|
| -
|
| -// static
|
| -bool BrowserThread::IsMessageLoopValid(ID identifier) {
|
| - base::AutoLock lock(lock_);
|
| - DCHECK(identifier >= 0 && identifier < ID_COUNT);
|
| - return browser_threads_[identifier] &&
|
| - browser_threads_[identifier]->message_loop();
|
| -}
|
| -
|
| -// static
|
| -bool BrowserThread::PostTask(ID identifier,
|
| - const tracked_objects::Location& from_here,
|
| - const base::Closure& task) {
|
| - return PostTaskHelper(identifier, from_here, task, 0, true);
|
| -}
|
| -
|
| -// static
|
| -bool BrowserThread::PostDelayedTask(ID identifier,
|
| - const tracked_objects::Location& from_here,
|
| - const base::Closure& task,
|
| - int64 delay_ms) {
|
| - return PostTaskHelper(identifier, from_here, task, delay_ms, true);
|
| -}
|
| -
|
| -// static
|
| -bool BrowserThread::PostNonNestableTask(
|
| - ID identifier,
|
| - const tracked_objects::Location& from_here,
|
| - const base::Closure& task) {
|
| - return PostTaskHelper(identifier, from_here, task, 0, false);
|
| -}
|
| -
|
| -// static
|
| -bool BrowserThread::PostNonNestableDelayedTask(
|
| - ID identifier,
|
| - const tracked_objects::Location& from_here,
|
| - const base::Closure& task,
|
| - int64 delay_ms) {
|
| - return PostTaskHelper(identifier, from_here, task, delay_ms, false);
|
| -}
|
| -
|
| -// static
|
| -bool BrowserThread::PostTask(ID identifier,
|
| - const tracked_objects::Location& from_here,
|
| - Task* task) {
|
| - return PostTaskHelper(identifier, from_here, task, 0, true);
|
| -}
|
| -
|
| -// static
|
| -bool BrowserThread::PostDelayedTask(ID identifier,
|
| - const tracked_objects::Location& from_here,
|
| - Task* task,
|
| - int64 delay_ms) {
|
| - return PostTaskHelper(identifier, from_here, task, delay_ms, true);
|
| -}
|
| -
|
| -// static
|
| -bool BrowserThread::PostNonNestableTask(
|
| - ID identifier,
|
| - const tracked_objects::Location& from_here,
|
| - Task* task) {
|
| - return PostTaskHelper(identifier, from_here, task, 0, false);
|
| -}
|
| -
|
| -// static
|
| -bool BrowserThread::PostNonNestableDelayedTask(
|
| - ID identifier,
|
| - const tracked_objects::Location& from_here,
|
| - Task* task,
|
| - int64 delay_ms) {
|
| - return PostTaskHelper(identifier, from_here, task, delay_ms, false);
|
| -}
|
| -
|
| -// static
|
| -bool BrowserThread::PostTaskAndReply(
|
| - ID identifier,
|
| - const tracked_objects::Location& from_here,
|
| - const base::Closure& task,
|
| - const base::Closure& reply) {
|
| - return GetMessageLoopProxyForThread(identifier)->PostTaskAndReply(from_here,
|
| - task,
|
| - reply);
|
| -}
|
| -
|
| -// static
|
| -bool BrowserThread::GetCurrentThreadIdentifier(ID* identifier) {
|
| - // We shouldn't use MessageLoop::current() since it uses LazyInstance which
|
| - // may be deleted by ~AtExitManager when a WorkerPool thread calls this
|
| - // function.
|
| - // http://crbug.com/63678
|
| - base::ThreadRestrictions::ScopedAllowSingleton allow_singleton;
|
| - MessageLoop* cur_message_loop = MessageLoop::current();
|
| - for (int i = 0; i < ID_COUNT; ++i) {
|
| - if (browser_threads_[i] &&
|
| - browser_threads_[i]->message_loop() == cur_message_loop) {
|
| - *identifier = browser_threads_[i]->identifier_;
|
| - return true;
|
| - }
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| -// static
|
| -scoped_refptr<base::MessageLoopProxy>
|
| -BrowserThread::GetMessageLoopProxyForThread(
|
| - ID identifier) {
|
| - scoped_refptr<base::MessageLoopProxy> proxy(
|
| - new BrowserThreadMessageLoopProxy(identifier));
|
| - return proxy;
|
| -}
|
| -
|
| -// static
|
| -bool BrowserThread::PostTaskHelper(
|
| - ID identifier,
|
| - const tracked_objects::Location& from_here,
|
| - Task* task,
|
| - int64 delay_ms,
|
| - bool nestable) {
|
| - DCHECK(identifier >= 0 && identifier < ID_COUNT);
|
| - // Optimization: to avoid unnecessary locks, we listed the ID enumeration in
|
| - // order of lifetime. So no need to lock if we know that the other thread
|
| - // outlives this one.
|
| - // Note: since the array is so small, ok to loop instead of creating a map,
|
| - // which would require a lock because std::map isn't thread safe, defeating
|
| - // the whole purpose of this optimization.
|
| - ID current_thread;
|
| - bool guaranteed_to_outlive_target_thread =
|
| - GetCurrentThreadIdentifier(¤t_thread) &&
|
| - current_thread >= identifier;
|
| -
|
| - if (!guaranteed_to_outlive_target_thread)
|
| - lock_.Acquire();
|
| -
|
| - MessageLoop* message_loop = browser_threads_[identifier] ?
|
| - browser_threads_[identifier]->message_loop() : NULL;
|
| - if (message_loop) {
|
| - if (nestable) {
|
| - message_loop->PostDelayedTask(from_here, task, delay_ms);
|
| - } else {
|
| - message_loop->PostNonNestableDelayedTask(from_here, task, delay_ms);
|
| - }
|
| - }
|
| -
|
| - if (!guaranteed_to_outlive_target_thread)
|
| - lock_.Release();
|
| -
|
| - if (!message_loop)
|
| - delete task;
|
| -
|
| - return !!message_loop;
|
| -}
|
| -
|
| -// static
|
| -bool BrowserThread::PostTaskHelper(
|
| - ID identifier,
|
| - const tracked_objects::Location& from_here,
|
| - const base::Closure& task,
|
| - int64 delay_ms,
|
| - bool nestable) {
|
| - DCHECK(identifier >= 0 && identifier < ID_COUNT);
|
| - // Optimization: to avoid unnecessary locks, we listed the ID enumeration in
|
| - // order of lifetime. So no need to lock if we know that the other thread
|
| - // outlives this one.
|
| - // Note: since the array is so small, ok to loop instead of creating a map,
|
| - // which would require a lock because std::map isn't thread safe, defeating
|
| - // the whole purpose of this optimization.
|
| - ID current_thread;
|
| - bool guaranteed_to_outlive_target_thread =
|
| - GetCurrentThreadIdentifier(¤t_thread) &&
|
| - current_thread >= identifier;
|
| -
|
| - if (!guaranteed_to_outlive_target_thread)
|
| - lock_.Acquire();
|
| -
|
| - MessageLoop* message_loop = browser_threads_[identifier] ?
|
| - browser_threads_[identifier]->message_loop() : NULL;
|
| - if (message_loop) {
|
| - if (nestable) {
|
| - message_loop->PostDelayedTask(from_here, task, delay_ms);
|
| - } else {
|
| - message_loop->PostNonNestableDelayedTask(from_here, task, delay_ms);
|
| - }
|
| - }
|
| -
|
| - if (!guaranteed_to_outlive_target_thread)
|
| - lock_.Release();
|
| -
|
| - return !!message_loop;
|
| -}
|
|
|