| Index: chrome/browser/metrics/thread_watcher.cc
 | 
| ===================================================================
 | 
| --- chrome/browser/metrics/thread_watcher.cc	(revision 117912)
 | 
| +++ chrome/browser/metrics/thread_watcher.cc	(working copy)
 | 
| @@ -564,6 +564,11 @@
 | 
|    ThreadWatcherList* thread_watcher_list = new ThreadWatcherList();
 | 
|    CHECK(thread_watcher_list);
 | 
|  
 | 
| +  BrowserThread::PostTask(
 | 
| +      BrowserThread::UI,
 | 
| +      FROM_HERE,
 | 
| +      base::Bind(&StartupTimeBomb::DisarmStartupTimeBomb));
 | 
| +
 | 
|    const base::TimeDelta kSleepTime =
 | 
|        base::TimeDelta::FromSeconds(kSleepSeconds);
 | 
|    const base::TimeDelta kUnresponsiveTime =
 | 
| @@ -588,11 +593,6 @@
 | 
|    StartWatching(BrowserThread::CACHE, "CACHE", kSleepTime, kUnresponsiveTime,
 | 
|                  unresponsive_threshold, crash_on_hang_thread_names,
 | 
|                  live_threads_threshold);
 | 
| -
 | 
| -  BrowserThread::PostTask(
 | 
| -      BrowserThread::UI,
 | 
| -      FROM_HERE,
 | 
| -      base::Bind(&StartupTimeBomb::DisarmStartupTimeBomb));
 | 
|  }
 | 
|  
 | 
|  // static
 | 
| @@ -844,7 +844,6 @@
 | 
|  
 | 
|  void StartupTimeBomb::Arm(const base::TimeDelta& duration) {
 | 
|    DCHECK_EQ(thread_id_, base::PlatformThread::CurrentId());
 | 
| -  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 | 
|    DCHECK(!startup_watchdog_);
 | 
|    startup_watchdog_ = new StartupWatchDogThread(duration);
 | 
|    startup_watchdog_->Arm();
 | 
| @@ -852,15 +851,28 @@
 | 
|  
 | 
|  void StartupTimeBomb::Disarm() {
 | 
|    DCHECK_EQ(thread_id_, base::PlatformThread::CurrentId());
 | 
| -  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 | 
|    if (startup_watchdog_) {
 | 
|      startup_watchdog_->Disarm();
 | 
| +    startup_watchdog_->Cleanup();
 | 
| +    DeleteStartupWatchdog();
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +void StartupTimeBomb::DeleteStartupWatchdog() {
 | 
| +  DCHECK_EQ(thread_id_, base::PlatformThread::CurrentId());
 | 
| +  if (startup_watchdog_->IsJoinable()) {
 | 
|      // Allow the watchdog thread to shutdown on UI. Watchdog thread shutdowns
 | 
|      // very fast.
 | 
|      base::ThreadRestrictions::SetIOAllowed(true);
 | 
|      delete startup_watchdog_;
 | 
|      startup_watchdog_ = NULL;
 | 
| +    return;
 | 
|    }
 | 
| +  MessageLoop::current()->PostDelayedTask(
 | 
| +      FROM_HERE,
 | 
| +      base::Bind(&StartupTimeBomb::DeleteStartupWatchdog,
 | 
| +                 base::Unretained(this)),
 | 
| +      base::TimeDelta::FromSeconds(10).InMilliseconds());
 | 
|  }
 | 
|  
 | 
|  // static
 | 
| 
 |