| OLD | NEW |
| 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/debug/alias.h" | 9 #include "base/debug/alias.h" |
| 10 #include "base/string_tokenizer.h" | 10 #include "base/string_tokenizer.h" |
| 11 #include "base/threading/thread_restrictions.h" | 11 #include "base/threading/thread_restrictions.h" |
| 12 #include "build/build_config.h" | 12 #include "build/build_config.h" |
| 13 #include "chrome/browser/metrics/metrics_service.h" | 13 #include "chrome/browser/metrics/metrics_service.h" |
| 14 #include "chrome/common/chrome_switches.h" | 14 #include "chrome/common/chrome_switches.h" |
| 15 #include "chrome/common/chrome_version_info.h" | 15 #include "chrome/common/chrome_version_info.h" |
| 16 #include "content/common/notification_service.h" | 16 #include "content/common/notification_service.h" |
| 17 | 17 |
| 18 #if defined(OS_WIN) | 18 #if defined(OS_WIN) |
| 19 #include <Objbase.h> | 19 #include "base/win/windows_version.h" |
| 20 #endif | 20 #endif |
| 21 | 21 |
| 22 // static | 22 // static |
| 23 const int ThreadWatcher::kPingCount = 6; | 23 const int ThreadWatcher::kPingCount = 6; |
| 24 | 24 |
| 25 // ThreadWatcher methods and members. | 25 // ThreadWatcher methods and members. |
| 26 ThreadWatcher::ThreadWatcher(const BrowserThread::ID& thread_id, | 26 ThreadWatcher::ThreadWatcher(const BrowserThread::ID& thread_id, |
| 27 const std::string& thread_name, | 27 const std::string& thread_name, |
| 28 const base::TimeDelta& sleep_time, | 28 const base::TimeDelta& sleep_time, |
| 29 const base::TimeDelta& unresponsive_time, | 29 const base::TimeDelta& unresponsive_time, |
| (...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 410 } | 410 } |
| 411 | 411 |
| 412 // static | 412 // static |
| 413 void ThreadWatcherList::ParseCommandLine( | 413 void ThreadWatcherList::ParseCommandLine( |
| 414 const CommandLine& command_line, | 414 const CommandLine& command_line, |
| 415 uint32* unresponsive_threshold, | 415 uint32* unresponsive_threshold, |
| 416 std::set<std::string>* crash_on_hang_thread_names, | 416 std::set<std::string>* crash_on_hang_thread_names, |
| 417 uint32* live_threads_threshold) { | 417 uint32* live_threads_threshold) { |
| 418 // Determine |unresponsive_threshold| based on switches::kCrashOnHangSeconds. | 418 // Determine |unresponsive_threshold| based on switches::kCrashOnHangSeconds. |
| 419 *unresponsive_threshold = kUnresponsiveCount; | 419 *unresponsive_threshold = kUnresponsiveCount; |
| 420 |
| 421 if (chrome::VersionInfo::GetChannel() == chrome::VersionInfo::CHANNEL_BETA) { |
| 422 // Increase the unresponsive_threshold in Beta channel to reduce the number |
| 423 // of crashes due to ThreadWatcher. |
| 424 *unresponsive_threshold *= 2; |
| 425 } else { |
| 426 // In Canary and Dev channels, for Windows XP (old systems), double the |
| 427 // unresponsive_threshold to give OS a chance to schedule UI/IO threads a |
| 428 // time slice to respond with a pong message (to get around limitations with |
| 429 // the OS). |
| 430 #if defined(OS_WIN) |
| 431 if (base::win::GetVersion() <= base::win::VERSION_XP) |
| 432 *unresponsive_threshold *= 2; |
| 433 #endif |
| 434 } |
| 435 |
| 420 std::string crash_on_hang_seconds = | 436 std::string crash_on_hang_seconds = |
| 421 command_line.GetSwitchValueASCII(switches::kCrashOnHangSeconds); | 437 command_line.GetSwitchValueASCII(switches::kCrashOnHangSeconds); |
| 422 if (!crash_on_hang_seconds.empty()) { | 438 if (!crash_on_hang_seconds.empty()) { |
| 423 int crash_seconds = atoi(crash_on_hang_seconds.c_str()); | 439 int crash_seconds = atoi(crash_on_hang_seconds.c_str()); |
| 424 if (crash_seconds > 0) { | 440 if (crash_seconds > 0) { |
| 425 *unresponsive_threshold = static_cast<uint32>( | 441 *unresponsive_threshold = static_cast<uint32>( |
| 426 ceil(static_cast<float>(crash_seconds) / kUnresponsiveSeconds)); | 442 ceil(static_cast<float>(crash_seconds) / kUnresponsiveSeconds)); |
| 427 } | 443 } |
| 428 } | 444 } |
| 429 | 445 |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 | 674 |
| 659 base::AutoLock lock(lock_); | 675 base::AutoLock lock(lock_); |
| 660 CHECK(!watchdog_thread_); | 676 CHECK(!watchdog_thread_); |
| 661 watchdog_thread_ = this; | 677 watchdog_thread_ = this; |
| 662 } | 678 } |
| 663 | 679 |
| 664 void WatchDogThread::CleanUp() { | 680 void WatchDogThread::CleanUp() { |
| 665 base::AutoLock lock(lock_); | 681 base::AutoLock lock(lock_); |
| 666 watchdog_thread_ = NULL; | 682 watchdog_thread_ = NULL; |
| 667 } | 683 } |
| OLD | NEW |