| Index: content/browser/browser_thread_impl.cc
|
| diff --git a/content/browser/browser_thread.cc b/content/browser/browser_thread_impl.cc
|
| similarity index 68%
|
| rename from content/browser/browser_thread.cc
|
| rename to content/browser/browser_thread_impl.cc
|
| index c3b400540e8d8897a68ea7cccccd4340f4b65908..39fa636da7235c03cc66474a1d2bacae7605aff3 100644
|
| --- a/content/browser/browser_thread.cc
|
| +++ b/content/browser/browser_thread_impl.cc
|
| @@ -2,13 +2,15 @@
|
| // 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 "content/browser/browser_thread_impl.h"
|
|
|
| #include "base/bind.h"
|
| #include "base/message_loop.h"
|
| #include "base/message_loop_proxy.h"
|
| #include "base/threading/thread_restrictions.h"
|
|
|
| +namespace {
|
| +
|
| // Friendly names for the well-known threads.
|
| static const char* browser_thread_names[BrowserThread::ID_COUNT] = {
|
| "", // UI (name assembled in browser_main.cc).
|
| @@ -23,6 +25,120 @@ static const char* browser_thread_names[BrowserThread::ID_COUNT] = {
|
| #endif
|
| };
|
|
|
| +} // namespace
|
| +
|
| +namespace content {
|
| +
|
| +base::Lock BrowserThreadImpl::lock_;
|
| +
|
| +BrowserThread* BrowserThreadImpl::browser_threads_[ID_COUNT];
|
| +
|
| +BrowserThreadImpl::BrowserThreadImpl(BrowserThread::ID identifier)
|
| + : BrowserThread(identifier) {
|
| +}
|
| +
|
| +BrowserThreadImpl::BrowserThreadImpl(BrowserThread::ID identifier,
|
| + MessageLoop* message_loop)
|
| + : BrowserThread(identifier, message_loop) {
|
| +}
|
| +
|
| +BrowserThreadImpl::~BrowserThreadImpl() {
|
| +}
|
| +
|
| +// static
|
| +bool BrowserThreadImpl::PostTaskHelper(
|
| + BrowserThread::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.
|
| + BrowserThread::ID current_thread;
|
| + bool guaranteed_to_outlive_target_thread =
|
| + GetCurrentThreadIdentifier(¤t_thread) &&
|
| + current_thread >= identifier;
|
| +
|
| + if (!guaranteed_to_outlive_target_thread)
|
| + BrowserThreadImpl::lock_.Acquire();
|
| +
|
| + MessageLoop* message_loop = BrowserThreadImpl::browser_threads_[identifier] ?
|
| + BrowserThreadImpl::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)
|
| + BrowserThreadImpl::lock_.Release();
|
| +
|
| + if (!message_loop)
|
| + delete task;
|
| +
|
| + return !!message_loop;
|
| +}
|
| +
|
| +// static
|
| +bool BrowserThreadImpl::PostTaskHelper(
|
| + BrowserThread::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.
|
| + BrowserThread::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;
|
| +}
|
| +
|
| +} // namespace content
|
| +
|
| +using content::BrowserThreadImpl;
|
| +
|
| +// TODO(joi): Remove
|
| +DeprecatedBrowserThread::DeprecatedBrowserThread(BrowserThread::ID identifier)
|
| + : BrowserThread(identifier) {
|
| +}
|
| +DeprecatedBrowserThread::DeprecatedBrowserThread(BrowserThread::ID identifier,
|
| + MessageLoop* message_loop)
|
| + : BrowserThread(identifier, message_loop) {
|
| +}
|
| +DeprecatedBrowserThread::~DeprecatedBrowserThread() {
|
| +}
|
| +
|
| // An implementation of MessageLoopProxy to be used in conjunction
|
| // with BrowserThread.
|
| class BrowserThreadMessageLoopProxy : public base::MessageLoopProxy {
|
| @@ -87,18 +203,14 @@ class BrowserThreadMessageLoopProxy : public base::MessageLoopProxy {
|
| DISALLOW_COPY_AND_ASSIGN(BrowserThreadMessageLoopProxy);
|
| };
|
|
|
| -
|
| -base::Lock BrowserThread::lock_;
|
| -
|
| -BrowserThread* BrowserThread::browser_threads_[ID_COUNT];
|
| -
|
| -BrowserThread::BrowserThread(BrowserThread::ID identifier)
|
| +BrowserThread::BrowserThread(ID identifier)
|
| : Thread(browser_thread_names[identifier]),
|
| identifier_(identifier) {
|
| Initialize();
|
| }
|
|
|
| -BrowserThread::BrowserThread(ID identifier, MessageLoop* message_loop)
|
| +BrowserThread::BrowserThread(ID identifier,
|
| + MessageLoop* message_loop)
|
| : Thread(message_loop->thread_name().c_str()),
|
| identifier_(identifier) {
|
| set_message_loop(message_loop);
|
| @@ -106,10 +218,10 @@ BrowserThread::BrowserThread(ID identifier, MessageLoop* message_loop)
|
| }
|
|
|
| void BrowserThread::Initialize() {
|
| - base::AutoLock lock(lock_);
|
| + base::AutoLock lock(BrowserThreadImpl::lock_);
|
| DCHECK(identifier_ >= 0 && identifier_ < ID_COUNT);
|
| - DCHECK(browser_threads_[identifier_] == NULL);
|
| - browser_threads_[identifier_] = this;
|
| + DCHECK(BrowserThreadImpl::browser_threads_[identifier_] == NULL);
|
| + BrowserThreadImpl::browser_threads_[identifier_] = this;
|
| }
|
|
|
| BrowserThread::~BrowserThread() {
|
| @@ -118,12 +230,12 @@ BrowserThread::~BrowserThread() {
|
| // correct BrowserThread succeeds.
|
| Stop();
|
|
|
| - base::AutoLock lock(lock_);
|
| - browser_threads_[identifier_] = NULL;
|
| + base::AutoLock lock(BrowserThreadImpl::lock_);
|
| + BrowserThreadImpl::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]) <<
|
| + DCHECK(!BrowserThreadImpl::browser_threads_[i]) <<
|
| "Threads must be listed in the reverse order that they die";
|
| }
|
| #endif
|
| @@ -131,9 +243,9 @@ BrowserThread::~BrowserThread() {
|
|
|
| // static
|
| bool BrowserThread::IsWellKnownThread(ID identifier) {
|
| - base::AutoLock lock(lock_);
|
| + base::AutoLock lock(BrowserThreadImpl::lock_);
|
| return (identifier >= 0 && identifier < ID_COUNT &&
|
| - browser_threads_[identifier]);
|
| + BrowserThreadImpl::browser_threads_[identifier]);
|
| }
|
|
|
| // static
|
| @@ -143,33 +255,36 @@ bool BrowserThread::CurrentlyOn(ID identifier) {
|
| // function.
|
| // http://crbug.com/63678
|
| base::ThreadRestrictions::ScopedAllowSingleton allow_singleton;
|
| - base::AutoLock lock(lock_);
|
| + base::AutoLock lock(BrowserThreadImpl::lock_);
|
| DCHECK(identifier >= 0 && identifier < ID_COUNT);
|
| - return browser_threads_[identifier] &&
|
| - browser_threads_[identifier]->message_loop() == MessageLoop::current();
|
| + return BrowserThreadImpl::browser_threads_[identifier] &&
|
| + BrowserThreadImpl::browser_threads_[identifier]->message_loop() ==
|
| + MessageLoop::current();
|
| }
|
|
|
| // static
|
| bool BrowserThread::IsMessageLoopValid(ID identifier) {
|
| - base::AutoLock lock(lock_);
|
| + base::AutoLock lock(BrowserThreadImpl::lock_);
|
| DCHECK(identifier >= 0 && identifier < ID_COUNT);
|
| - return browser_threads_[identifier] &&
|
| - browser_threads_[identifier]->message_loop();
|
| + return BrowserThreadImpl::browser_threads_[identifier] &&
|
| + BrowserThreadImpl::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);
|
| + const tracked_objects::Location& from_here,
|
| + const base::Closure& task) {
|
| + return BrowserThreadImpl::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);
|
| + const tracked_objects::Location& from_here,
|
| + const base::Closure& task,
|
| + int64 delay_ms) {
|
| + return BrowserThreadImpl::PostTaskHelper(
|
| + identifier, from_here, task, delay_ms, true);
|
| }
|
|
|
| // static
|
| @@ -177,7 +292,8 @@ bool BrowserThread::PostNonNestableTask(
|
| ID identifier,
|
| const tracked_objects::Location& from_here,
|
| const base::Closure& task) {
|
| - return PostTaskHelper(identifier, from_here, task, 0, false);
|
| + return BrowserThreadImpl::PostTaskHelper(
|
| + identifier, from_here, task, 0, false);
|
| }
|
|
|
| // static
|
| @@ -186,22 +302,25 @@ bool BrowserThread::PostNonNestableDelayedTask(
|
| const tracked_objects::Location& from_here,
|
| const base::Closure& task,
|
| int64 delay_ms) {
|
| - return PostTaskHelper(identifier, from_here, task, delay_ms, false);
|
| + return BrowserThreadImpl::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);
|
| + const tracked_objects::Location& from_here,
|
| + Task* task) {
|
| + return BrowserThreadImpl::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);
|
| + const tracked_objects::Location& from_here,
|
| + Task* task,
|
| + int64 delay_ms) {
|
| + return BrowserThreadImpl::PostTaskHelper(
|
| + identifier, from_here, task, delay_ms, true);
|
| }
|
|
|
| // static
|
| @@ -209,7 +328,8 @@ bool BrowserThread::PostNonNestableTask(
|
| ID identifier,
|
| const tracked_objects::Location& from_here,
|
| Task* task) {
|
| - return PostTaskHelper(identifier, from_here, task, 0, false);
|
| + return BrowserThreadImpl::PostTaskHelper(
|
| + identifier, from_here, task, 0, false);
|
| }
|
|
|
| // static
|
| @@ -218,7 +338,8 @@ bool BrowserThread::PostNonNestableDelayedTask(
|
| const tracked_objects::Location& from_here,
|
| Task* task,
|
| int64 delay_ms) {
|
| - return PostTaskHelper(identifier, from_here, task, delay_ms, false);
|
| + return BrowserThreadImpl::PostTaskHelper(
|
| + identifier, from_here, task, delay_ms, false);
|
| }
|
|
|
| // static
|
| @@ -241,9 +362,10 @@ bool BrowserThread::GetCurrentThreadIdentifier(ID* identifier) {
|
| 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_;
|
| + if (BrowserThreadImpl::browser_threads_[i] &&
|
| + BrowserThreadImpl::browser_threads_[i]->message_loop() ==
|
| + cur_message_loop) {
|
| + *identifier = BrowserThreadImpl::browser_threads_[i]->identifier_;
|
| return true;
|
| }
|
| }
|
| @@ -259,82 +381,3 @@ BrowserThread::GetMessageLoopProxyForThread(
|
| 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;
|
| -}
|
|
|