OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 902 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
913 | 913 |
914 // StartupWatchDogThread methods and members. | 914 // StartupWatchDogThread methods and members. |
915 // | 915 // |
916 // Class for detecting hangs during startup. | 916 // Class for detecting hangs during startup. |
917 class StartupWatchDogThread : public base::Watchdog { | 917 class StartupWatchDogThread : public base::Watchdog { |
918 public: | 918 public: |
919 // Constructor specifies how long the StartupWatchDogThread will wait before | 919 // Constructor specifies how long the StartupWatchDogThread will wait before |
920 // alarming. | 920 // alarming. |
921 explicit StartupWatchDogThread(const base::TimeDelta& duration) | 921 explicit StartupWatchDogThread(const base::TimeDelta& duration) |
922 : base::Watchdog(duration, "Startup watchdog thread", true) { | 922 : base::Watchdog(duration, "Startup watchdog thread", true) { |
923 #if defined(OS_ANDROID) | |
924 // TODO(rtenneti): Delete this code, after getting data. | |
925 start_time_clock_= base::Time::Now(); | |
926 start_time_monotonic_ = base::TimeTicks::Now(); | |
927 start_time_thread_now_ = base::TimeTicks::IsThreadNowSupported() | |
928 ? base::TimeTicks::ThreadNow() : base::TimeTicks::Now(); | |
929 #endif // OS_ANDROID | |
930 } | 923 } |
931 | 924 |
932 // Alarm is called if the time expires after an Arm() without someone calling | 925 // Alarm is called if the time expires after an Arm() without someone calling |
933 // Disarm(). When Alarm goes off, in release mode we get the crash dump | 926 // Disarm(). When Alarm goes off, in release mode we get the crash dump |
934 // without crashing and in debug mode we break into the debugger. | 927 // without crashing and in debug mode we break into the debugger. |
935 void Alarm() override { | 928 void Alarm() override { |
936 #if !defined(NDEBUG) | 929 #if !defined(NDEBUG) |
937 StartupHang(); | 930 StartupHang(); |
938 return; | 931 return; |
939 #elif !defined(OS_ANDROID) | 932 #elif !defined(OS_ANDROID) |
940 WatchDogThread::PostTask(FROM_HERE, base::Bind(&StartupHang)); | 933 WatchDogThread::PostTask(FROM_HERE, base::Bind(&StartupHang)); |
941 return; | 934 return; |
942 #else // Android release: gather stats to figure out when to crash. | 935 #else |
943 // TODO(rtenneti): Delete this code, after getting data. | 936 // TODO(rtenneti): Enable crashing for Android. |
944 UMA_HISTOGRAM_TIMES("StartupTimeBomb.Alarm.TimeDuration", | |
945 base::Time::Now() - start_time_clock_); | |
946 UMA_HISTOGRAM_TIMES("StartupTimeBomb.Alarm.TimeTicksDuration", | |
947 base::TimeTicks::Now() - start_time_monotonic_); | |
948 if (base::TimeTicks::IsThreadNowSupported()) { | |
949 UMA_HISTOGRAM_TIMES( | |
950 "StartupTimeBomb.Alarm.ThreadNowDuration", | |
951 base::TimeTicks::ThreadNow() - start_time_thread_now_); | |
952 } | |
953 return; | |
954 #endif // OS_ANDROID | 937 #endif // OS_ANDROID |
955 } | 938 } |
956 | 939 |
957 private: | 940 private: |
958 #if defined(OS_ANDROID) | |
959 // TODO(rtenneti): Delete this code, after getting data. | |
960 base::Time start_time_clock_; | |
961 base::TimeTicks start_time_monotonic_; | |
962 base::TimeTicks start_time_thread_now_; | |
963 #endif // OS_ANDROID | |
964 | |
965 DISALLOW_COPY_AND_ASSIGN(StartupWatchDogThread); | 941 DISALLOW_COPY_AND_ASSIGN(StartupWatchDogThread); |
966 }; | 942 }; |
967 | 943 |
968 // ShutdownWatchDogThread methods and members. | 944 // ShutdownWatchDogThread methods and members. |
969 // | 945 // |
970 // Class for detecting hangs during shutdown. | 946 // Class for detecting hangs during shutdown. |
971 class ShutdownWatchDogThread : public base::Watchdog { | 947 class ShutdownWatchDogThread : public base::Watchdog { |
972 public: | 948 public: |
973 // Constructor specifies how long the ShutdownWatchDogThread will wait before | 949 // Constructor specifies how long the ShutdownWatchDogThread will wait before |
974 // alarming. | 950 // alarming. |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1079 | 1055 |
1080 #if defined(OS_WIN) | 1056 #if defined(OS_WIN) |
1081 // On Windows XP, give twice the time for shutdown. | 1057 // On Windows XP, give twice the time for shutdown. |
1082 if (base::win::GetVersion() <= base::win::VERSION_XP) | 1058 if (base::win::GetVersion() <= base::win::VERSION_XP) |
1083 actual_duration *= 2; | 1059 actual_duration *= 2; |
1084 #endif | 1060 #endif |
1085 | 1061 |
1086 shutdown_watchdog_ = new ShutdownWatchDogThread(actual_duration); | 1062 shutdown_watchdog_ = new ShutdownWatchDogThread(actual_duration); |
1087 shutdown_watchdog_->Arm(); | 1063 shutdown_watchdog_->Arm(); |
1088 } | 1064 } |
OLD | NEW |