| Index: chrome/browser/metrics/thread_watcher.cc
|
| diff --git a/chrome/browser/metrics/thread_watcher.cc b/chrome/browser/metrics/thread_watcher.cc
|
| index a971743c9456e96cd187a5c39348164cccc5cd88..01f5e0db2245355db9e819a33e0a5177d67ef55f 100644
|
| --- a/chrome/browser/metrics/thread_watcher.cc
|
| +++ b/chrome/browser/metrics/thread_watcher.cc
|
| @@ -9,6 +9,7 @@
|
| #include "base/bind.h"
|
| #include "base/compiler_specific.h"
|
| #include "base/debug/alias.h"
|
| +#include "base/lazy_instance.h"
|
| #include "base/string_tokenizer.h"
|
| #include "base/threading/thread_restrictions.h"
|
| #include "build/build_config.h"
|
| @@ -702,11 +703,15 @@ void ThreadWatcherObserver::Observe(
|
| }
|
|
|
| // WatchDogThread methods and members.
|
| -//
|
| -// static
|
| -base::Lock WatchDogThread::lock_;
|
| -// static
|
| -WatchDogThread* WatchDogThread::watchdog_thread_ = NULL;
|
| +
|
| +// This lock protects g_watchdog_thread.
|
| +static base::LazyInstance<base::Lock,
|
| + base::LeakyLazyInstanceTraits<base::Lock> >
|
| + g_watchdog_lock = LAZY_INSTANCE_INITIALIZER;
|
| +
|
| +// The singleton of this class.
|
| +static WatchDogThread* g_watchdog_thread = NULL;
|
| +
|
|
|
| // The WatchDogThread object must outlive any tasks posted to the IO thread
|
| // before the Quit task.
|
| @@ -721,9 +726,9 @@ WatchDogThread::~WatchDogThread() {
|
|
|
| // static
|
| bool WatchDogThread::CurrentlyOnWatchDogThread() {
|
| - base::AutoLock lock(lock_);
|
| - return watchdog_thread_ &&
|
| - watchdog_thread_->message_loop() == MessageLoop::current();
|
| + base::AutoLock lock(g_watchdog_lock.Get());
|
| + return g_watchdog_thread &&
|
| + g_watchdog_thread->message_loop() == MessageLoop::current();
|
| }
|
|
|
| // static
|
| @@ -745,10 +750,10 @@ bool WatchDogThread::PostTaskHelper(
|
| const base::Closure& task,
|
| int64 delay_ms) {
|
| {
|
| - base::AutoLock lock(lock_);
|
| + base::AutoLock lock(g_watchdog_lock.Get());
|
|
|
| - MessageLoop* message_loop = watchdog_thread_ ?
|
| - watchdog_thread_->message_loop() : NULL;
|
| + MessageLoop* message_loop = g_watchdog_thread ?
|
| + g_watchdog_thread->message_loop() : NULL;
|
| if (message_loop) {
|
| message_loop->PostDelayedTask(from_here, task, delay_ms);
|
| return true;
|
| @@ -762,14 +767,14 @@ void WatchDogThread::Init() {
|
| // This thread shouldn't be allowed to perform any blocking disk I/O.
|
| base::ThreadRestrictions::SetIOAllowed(false);
|
|
|
| - base::AutoLock lock(lock_);
|
| - CHECK(!watchdog_thread_);
|
| - watchdog_thread_ = this;
|
| + base::AutoLock lock(g_watchdog_lock.Get());
|
| + CHECK(!g_watchdog_thread);
|
| + g_watchdog_thread = this;
|
| }
|
|
|
| void WatchDogThread::CleanUp() {
|
| - base::AutoLock lock(lock_);
|
| - watchdog_thread_ = NULL;
|
| + base::AutoLock lock(g_watchdog_lock.Get());
|
| + g_watchdog_thread = NULL;
|
| }
|
|
|
| namespace {
|
|
|