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

Side by Side Diff: chrome/browser/performance_monitor/startup_timer.cc

Issue 10834015: Add Startup Timing to CPM (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 8 years, 4 months 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
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/performance_monitor/startup_timer.h"
6
7 #include "base/bind.h"
8 #include "base/logging.h"
9 #include "base/string_number_conversions.h"
10 #include "chrome/browser/performance_monitor/database.h"
11 #include "chrome/browser/performance_monitor/performance_monitor.h"
12 #include "chrome/common/chrome_notification_types.h"
13 #include "content/public/browser/browser_thread.h"
14 #include "content/public/browser/notification_details.h"
15 #include "content/public/browser/notification_service.h"
16 #include "content/public/browser/notification_source.h"
17 #include "content/public/browser/notification_types.h"
18
19 namespace performance_monitor {
20
21 namespace {
22 // Needed because Database::AddMetric is overloaded, so base::Bind doesn't work.
23 void AddMetricToDatabaseOnBackgroundThread(Database* database,
24 MetricType metric,
25 std::string value) {
26 database->AddMetric(metric, value);
27 }
28
29 } // namespace
30
31 // static
32 StartupTimer* StartupTimer::g_startup_timer_ = NULL;
33
34 StartupTimer::StartupTimer() : startup_begin_(base::TimeTicks::Now()),
35 normal_startup_(true),
36 performance_monitor_initialized_(false) {
37 CHECK(!g_startup_timer_);
38 g_startup_timer_ = this;
39 registrar_.Add(this, chrome::NOTIFICATION_PERFORMANCE_MONITOR_INITIALIZED,
40 content::NotificationService::AllSources());
41 }
42
43 StartupTimer::~StartupTimer() {
44 DCHECK(this == g_startup_timer_);
45 g_startup_timer_ = NULL;
46 }
47
48 bool StartupTimer::SignalStartupComplete(bool normal_startup) {
49 normal_startup_ = normal_startup;
50 if (!elapsed_startup_time_.is_null())
51 return false;
52
53 elapsed_startup_time_ =
54 base::TimeTicks::Now() - total_pause_ - startup_begin_;
55
56 if (performance_monitor_initialized_)
57 InsertStartupTime();
58
59 return true;
60 }
61
62 // static
63 bool StartupTimer::PauseTimer() {
64 return g_startup_timer_->PauseTimerImpl();
65 }
66
67 bool StartupTimer::PauseTimerImpl() {
68 if (!pause_started_.is_null())
69 return false;
70
71 pause_started_ = base::TimeTicks::Now();
72 return true;
73 }
74
75 // static
76 bool StartupTimer::UnpauseTimer() {
77 return g_startup_timer_->UnpauseTimerImpl();
78 }
79
80 bool StartupTimer::UnpauseTimerImpl() {
81 if (pause_started_.is_null())
82 return false;
83
84 total_pause_ = base::TimeTicks::Now() - pause_started_;
Yoyo Zhou 2012/07/31 09:57:32 If this = was += you could probably support more t
Devlin 2012/07/31 16:43:40 D'oh! Meant to have that... Done.
85 pause_started_ = base::TimeTicks();
86 return true;
87 }
88
89 void StartupTimer::Observe(int type,
90 const content::NotificationSource& source,
91 const content::NotificationDetails& details) {
92 CHECK(type == chrome::NOTIFICATION_PERFORMANCE_MONITOR_INITIALIZED);
93 performance_monitor_initialized_ = true;
94 if (!elapsed_startup_time_.is_null())
95 InsertStartupTime();
96 if (!session_restore_time_.is_null())
97 InsertSessionRestoreTime();
98 }
99
100 // static
101 void StartupTimer::SetSessionRestoreTime(
102 const base::TimeDelta& session_restore_time) {
103 g_startup_timer_->session_restore_time_ = session_restore_time;
104
105 if (g_startup_timer_->performance_monitor_initialized_)
106 g_startup_timer_->InsertSessionRestoreTime();
107 }
108
109 void StartupTimer::InsertStartupTime() {
110 content::BrowserThread::PostBlockingPoolSequencedTask(
111 Database::kDatabaseSequenceToken,
112 FROM_HERE,
113 base::Bind(
114 &AddMetricToDatabaseOnBackgroundThread,
115 base::Unretained(PerformanceMonitor::GetInstance()->database()),
116 normal_startup_ ? METRIC_STARTUP_TIME : METRIC_TEST_STARTUP_TIME,
117 base::Int64ToString(elapsed_startup_time_.ToInternalValue())));
118 }
119
120 void StartupTimer::InsertSessionRestoreTime() {
121 content::BrowserThread::PostBlockingPoolSequencedTask(
122 Database::kDatabaseSequenceToken,
123 FROM_HERE,
124 base::Bind(
125 &AddMetricToDatabaseOnBackgroundThread,
126 base::Unretained(PerformanceMonitor::GetInstance()->database()),
127 METRIC_SESSION_RESTORE_TIME,
128 base::Int64ToString(session_restore_time_.ToInternalValue())));
129 }
130
131 } // namespace performance_monitor
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698