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

Side by Side Diff: chrome/browser/metrics/thread_watcher.cc

Issue 8728035: Disarm StartupTimeBomb when it is deleted (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/metrics/thread_watcher.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/metrics/thread_watcher.h" 5 #include "chrome/browser/metrics/thread_watcher.h"
6 6
7 #include <math.h> // ceil 7 #include <math.h> // ceil
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after
583 StartWatching(BrowserThread::FILE, "FILE", kSleepTime, kUnresponsiveTime, 583 StartWatching(BrowserThread::FILE, "FILE", kSleepTime, kUnresponsiveTime,
584 unresponsive_threshold, crash_on_hang_thread_names, 584 unresponsive_threshold, crash_on_hang_thread_names,
585 live_threads_threshold); 585 live_threads_threshold);
586 StartWatching(BrowserThread::CACHE, "CACHE", kSleepTime, kUnresponsiveTime, 586 StartWatching(BrowserThread::CACHE, "CACHE", kSleepTime, kUnresponsiveTime,
587 unresponsive_threshold, crash_on_hang_thread_names, 587 unresponsive_threshold, crash_on_hang_thread_names,
588 live_threads_threshold); 588 live_threads_threshold);
589 589
590 BrowserThread::PostTask( 590 BrowserThread::PostTask(
591 BrowserThread::UI, 591 BrowserThread::UI,
592 FROM_HERE, 592 FROM_HERE,
593 base::Bind(StartupTimeBomb::Disarm)); 593 base::Bind(&StartupTimeBomb::DisarmStartupTimeBomb));
594 } 594 }
595 595
596 // static 596 // static
597 void ThreadWatcherList::StartWatching( 597 void ThreadWatcherList::StartWatching(
598 const BrowserThread::ID& thread_id, 598 const BrowserThread::ID& thread_id,
599 const std::string& thread_name, 599 const std::string& thread_name,
600 const base::TimeDelta& sleep_time, 600 const base::TimeDelta& sleep_time,
601 const base::TimeDelta& unresponsive_time, 601 const base::TimeDelta& unresponsive_time,
602 uint32 unresponsive_threshold, 602 uint32 unresponsive_threshold,
603 const std::set<std::string>& crash_on_hang_thread_names, 603 const std::set<std::string>& crash_on_hang_thread_names,
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 CHECK(false); 821 CHECK(false);
822 } 822 }
823 823
824 DISALLOW_COPY_AND_ASSIGN(ShutdownWatchDogThread); 824 DISALLOW_COPY_AND_ASSIGN(ShutdownWatchDogThread);
825 }; 825 };
826 } // namespace 826 } // namespace
827 827
828 // StartupTimeBomb methods and members. 828 // StartupTimeBomb methods and members.
829 // 829 //
830 // static 830 // static
831 base::Watchdog* StartupTimeBomb::startup_watchdog_ = NULL; 831 StartupTimeBomb* StartupTimeBomb::g_startup_timebomb_ = NULL;
832 832
833 // static 833 StartupTimeBomb::StartupTimeBomb()
834 : startup_watchdog_(NULL),
835 thread_id_(base::PlatformThread::CurrentId()) {
836 CHECK(!g_startup_timebomb_);
837 g_startup_timebomb_ = this;
838 }
839
840 StartupTimeBomb::~StartupTimeBomb() {
841 DCHECK(this == g_startup_timebomb_);
842 DCHECK_EQ(thread_id_, base::PlatformThread::CurrentId());
843 if (startup_watchdog_)
844 Disarm();
845 g_startup_timebomb_ = NULL;
846 }
847
834 void StartupTimeBomb::Arm(const base::TimeDelta& duration) { 848 void StartupTimeBomb::Arm(const base::TimeDelta& duration) {
849 DCHECK_EQ(thread_id_, base::PlatformThread::CurrentId());
835 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 850 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
836 DCHECK(!startup_watchdog_); 851 DCHECK(!startup_watchdog_);
837 startup_watchdog_ = new StartupWatchDogThread(duration); 852 startup_watchdog_ = new StartupWatchDogThread(duration);
838 startup_watchdog_->Arm(); 853 startup_watchdog_->Arm();
839 } 854 }
840 855
841 // static
842 void StartupTimeBomb::Disarm() { 856 void StartupTimeBomb::Disarm() {
857 DCHECK_EQ(thread_id_, base::PlatformThread::CurrentId());
843 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 858 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
844 if (startup_watchdog_) { 859 if (startup_watchdog_) {
845 startup_watchdog_->Disarm(); 860 startup_watchdog_->Disarm();
846 // Allow the watchdog thread to shutdown on UI. Watchdog thread shutdowns 861 // Allow the watchdog thread to shutdown on UI. Watchdog thread shutdowns
847 // very fast. 862 // very fast.
848 base::ThreadRestrictions::SetIOAllowed(true); 863 base::ThreadRestrictions::SetIOAllowed(true);
849 delete startup_watchdog_; 864 delete startup_watchdog_;
850 startup_watchdog_ = NULL; 865 startup_watchdog_ = NULL;
851 } 866 }
852 } 867 }
853 868
869 // static
870 void StartupTimeBomb::DisarmStartupTimeBomb() {
871 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
872 if (g_startup_timebomb_)
873 g_startup_timebomb_->Disarm();
874 }
875
854 // ShutdownWatcherHelper methods and members. 876 // ShutdownWatcherHelper methods and members.
855 // 877 //
856 // ShutdownWatcherHelper is a wrapper class for detecting hangs during 878 // ShutdownWatcherHelper is a wrapper class for detecting hangs during
857 // shutdown. 879 // shutdown.
858 ShutdownWatcherHelper::ShutdownWatcherHelper() : shutdown_watchdog_(NULL) { 880 ShutdownWatcherHelper::ShutdownWatcherHelper()
881 : shutdown_watchdog_(NULL),
882 thread_id_(base::PlatformThread::CurrentId()) {
859 } 883 }
860 884
861 ShutdownWatcherHelper::~ShutdownWatcherHelper() { 885 ShutdownWatcherHelper::~ShutdownWatcherHelper() {
886 DCHECK_EQ(thread_id_, base::PlatformThread::CurrentId());
862 if (shutdown_watchdog_) { 887 if (shutdown_watchdog_) {
863 shutdown_watchdog_->Disarm(); 888 shutdown_watchdog_->Disarm();
864 delete shutdown_watchdog_; 889 delete shutdown_watchdog_;
865 shutdown_watchdog_ = NULL; 890 shutdown_watchdog_ = NULL;
866 } 891 }
867 } 892 }
868 893
869 void ShutdownWatcherHelper::Arm(const base::TimeDelta& duration) { 894 void ShutdownWatcherHelper::Arm(const base::TimeDelta& duration) {
895 DCHECK_EQ(thread_id_, base::PlatformThread::CurrentId());
870 DCHECK(!shutdown_watchdog_); 896 DCHECK(!shutdown_watchdog_);
871 base::TimeDelta actual_duration = duration; 897 base::TimeDelta actual_duration = duration;
872 898
873 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); 899 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel();
874 if (channel == chrome::VersionInfo::CHANNEL_STABLE) { 900 if (channel == chrome::VersionInfo::CHANNEL_STABLE) {
875 actual_duration *= 50; 901 actual_duration *= 50;
876 } else if (channel == chrome::VersionInfo::CHANNEL_BETA || 902 } else if (channel == chrome::VersionInfo::CHANNEL_BETA ||
877 channel == chrome::VersionInfo::CHANNEL_DEV) { 903 channel == chrome::VersionInfo::CHANNEL_DEV) {
878 actual_duration *= 25; 904 actual_duration *= 25;
879 } 905 }
880 906
881 #if defined(OS_WIN) 907 #if defined(OS_WIN)
882 // On Windows XP, give twice the time for shutdown. 908 // On Windows XP, give twice the time for shutdown.
883 if (base::win::GetVersion() <= base::win::VERSION_XP) 909 if (base::win::GetVersion() <= base::win::VERSION_XP)
884 actual_duration *= 2; 910 actual_duration *= 2;
885 #endif 911 #endif
886 912
887 shutdown_watchdog_ = new ShutdownWatchDogThread(actual_duration); 913 shutdown_watchdog_ = new ShutdownWatchDogThread(actual_duration);
888 shutdown_watchdog_->Arm(); 914 shutdown_watchdog_->Arm();
889 } 915 }
OLDNEW
« no previous file with comments | « chrome/browser/metrics/thread_watcher.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698