Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(219)

Unified Diff: content/browser/browser_thread_impl.cc

Issue 8493016: content: Remove 16 exit time destructors and 15 static initializers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: mac compile Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/browser_thread_impl.h ('k') | content/browser/browsing_instance.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/browser_thread_impl.cc
diff --git a/content/browser/browser_thread_impl.cc b/content/browser/browser_thread_impl.cc
index 4b85b616cac113a76d6efae2fa73259e5f64ea60..d964af0639839c864acf4dc354332a1d1922272e 100644
--- a/content/browser/browser_thread_impl.cc
+++ b/content/browser/browser_thread_impl.cc
@@ -5,6 +5,7 @@
#include "content/browser/browser_thread_impl.h"
#include "base/bind.h"
+#include "base/lazy_instance.h"
#include "base/message_loop.h"
#include "base/message_loop_proxy.h"
#include "base/threading/thread_restrictions.h"
@@ -29,9 +30,22 @@ static const char* browser_thread_names[content::BrowserThread::ID_COUNT] = {
namespace content {
-base::Lock BrowserThreadImpl::lock_;
+namespace {
+
+// This lock protects |g_browser_threads|. Do not read or modify that array
+// without holding this lock. Do not block while holding this lock.
+base::LazyInstance<base::Lock,
+ base::LeakyLazyInstanceTraits<base::Lock> >
+ g_lock(base::LINKER_INITIALIZED);
+
-BrowserThread* BrowserThreadImpl::browser_threads_[ID_COUNT];
+// An array of the BrowserThread objects. This array is protected by |g_lock|.
+// The threads are not owned by this array. Typically, the threads are owned
+// on the UI thread by the g_browser_process object. BrowserThreads remove
+// themselves from this array upon destruction.
+BrowserThread* g_browser_threads[BrowserThread::ID_COUNT];
+
+} // namespace
BrowserThreadImpl::BrowserThreadImpl(BrowserThread::ID identifier)
: BrowserThread(identifier) {
@@ -66,10 +80,10 @@ bool BrowserThreadImpl::PostTaskHelper(
current_thread >= identifier;
if (!guaranteed_to_outlive_target_thread)
- BrowserThreadImpl::lock_.Acquire();
+ g_lock.Get().Acquire();
- MessageLoop* message_loop = BrowserThreadImpl::browser_threads_[identifier] ?
- BrowserThreadImpl::browser_threads_[identifier]->message_loop() : NULL;
+ MessageLoop* message_loop = g_browser_threads[identifier] ?
+ g_browser_threads[identifier]->message_loop() : NULL;
if (message_loop) {
if (nestable) {
message_loop->PostDelayedTask(from_here, task, delay_ms);
@@ -79,7 +93,7 @@ bool BrowserThreadImpl::PostTaskHelper(
}
if (!guaranteed_to_outlive_target_thread)
- BrowserThreadImpl::lock_.Release();
+ g_lock.Get().Release();
if (!message_loop)
delete task;
@@ -107,10 +121,10 @@ bool BrowserThreadImpl::PostTaskHelper(
current_thread >= identifier;
if (!guaranteed_to_outlive_target_thread)
- lock_.Acquire();
+ g_lock.Get().Acquire();
- MessageLoop* message_loop = browser_threads_[identifier] ?
- browser_threads_[identifier]->message_loop() : NULL;
+ MessageLoop* message_loop = g_browser_threads[identifier] ?
+ g_browser_threads[identifier]->message_loop() : NULL;
if (message_loop) {
if (nestable) {
message_loop->PostDelayedTask(from_here, task, delay_ms);
@@ -120,7 +134,7 @@ bool BrowserThreadImpl::PostTaskHelper(
}
if (!guaranteed_to_outlive_target_thread)
- lock_.Release();
+ g_lock.Get().Release();
return !!message_loop;
}
@@ -216,10 +230,10 @@ BrowserThread::BrowserThread(ID identifier,
}
void BrowserThread::Initialize() {
- base::AutoLock lock(BrowserThreadImpl::lock_);
+ base::AutoLock lock(g_lock.Get());
DCHECK(identifier_ >= 0 && identifier_ < ID_COUNT);
- DCHECK(BrowserThreadImpl::browser_threads_[identifier_] == NULL);
- BrowserThreadImpl::browser_threads_[identifier_] = this;
+ DCHECK(g_browser_threads[identifier_] == NULL);
+ g_browser_threads[identifier_] = this;
}
BrowserThread::~BrowserThread() {
@@ -228,12 +242,12 @@ BrowserThread::~BrowserThread() {
// correct BrowserThread succeeds.
Stop();
- base::AutoLock lock(BrowserThreadImpl::lock_);
- BrowserThreadImpl::browser_threads_[identifier_] = NULL;
+ base::AutoLock lock(g_lock.Get());
+ g_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(!BrowserThreadImpl::browser_threads_[i]) <<
+ DCHECK(!g_browser_threads[i]) <<
"Threads must be listed in the reverse order that they die";
}
#endif
@@ -241,9 +255,9 @@ BrowserThread::~BrowserThread() {
// static
bool BrowserThread::IsWellKnownThread(ID identifier) {
- base::AutoLock lock(BrowserThreadImpl::lock_);
+ base::AutoLock lock(g_lock.Get());
return (identifier >= 0 && identifier < ID_COUNT &&
- BrowserThreadImpl::browser_threads_[identifier]);
+ g_browser_threads[identifier]);
}
// static
@@ -253,19 +267,19 @@ bool BrowserThread::CurrentlyOn(ID identifier) {
// function.
// http://crbug.com/63678
base::ThreadRestrictions::ScopedAllowSingleton allow_singleton;
- base::AutoLock lock(BrowserThreadImpl::lock_);
+ base::AutoLock lock(g_lock.Get());
DCHECK(identifier >= 0 && identifier < ID_COUNT);
- return BrowserThreadImpl::browser_threads_[identifier] &&
- BrowserThreadImpl::browser_threads_[identifier]->message_loop() ==
+ return g_browser_threads[identifier] &&
+ g_browser_threads[identifier]->message_loop() ==
MessageLoop::current();
}
// static
bool BrowserThread::IsMessageLoopValid(ID identifier) {
- base::AutoLock lock(BrowserThreadImpl::lock_);
+ base::AutoLock lock(g_lock.Get());
DCHECK(identifier >= 0 && identifier < ID_COUNT);
- return BrowserThreadImpl::browser_threads_[identifier] &&
- BrowserThreadImpl::browser_threads_[identifier]->message_loop();
+ return g_browser_threads[identifier] &&
+ g_browser_threads[identifier]->message_loop();
}
// static
@@ -360,10 +374,9 @@ 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 (BrowserThreadImpl::browser_threads_[i] &&
- BrowserThreadImpl::browser_threads_[i]->message_loop() ==
- cur_message_loop) {
- *identifier = BrowserThreadImpl::browser_threads_[i]->identifier_;
+ if (g_browser_threads[i] &&
+ g_browser_threads[i]->message_loop() == cur_message_loop) {
+ *identifier = g_browser_threads[i]->identifier_;
return true;
}
}
« no previous file with comments | « content/browser/browser_thread_impl.h ('k') | content/browser/browsing_instance.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698