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

Side by Side Diff: dbus/dbus_statistics.cc

Issue 11363173: Add DBusStatistics and DBusLogSource to log and show dbus stats (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 1 month 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
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 "dbus/dbus_statistics.h"
6
7 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "base/stl_util.h"
10 #include "base/stringprintf.h"
11
12 namespace dbus {
13
14 namespace {
15 DbusStatistics* g_dbus_statistics = NULL;
16 }
hashimoto 2012/11/12 04:33:16 nit: Please add "// namespace"
stevenjb 2012/11/12 19:46:40 Re-factored
17
18 //------------------------------------------------------------------------------
19 // DbusStatistics
20
21 DbusStatistics::DbusStatistics() : start_time_(base::Time::Now()) {
22 }
23
24 DbusStatistics::~DbusStatistics() {
25 STLDeleteContainerPointers(stats_.begin(), stats_.end());
26 }
27
28 // static
29 void DbusStatistics::Initialize() {
30 if (g_dbus_statistics)
31 delete g_dbus_statistics; // reset statistics
32 g_dbus_statistics = new DbusStatistics();
33 }
34
35 // static
36 void DbusStatistics::Shutdown() {
37 delete g_dbus_statistics;
38 g_dbus_statistics = NULL;
39 }
40
41 // static
42 void DbusStatistics::AddSentCall(const std::string& service,
43 const std::string& interface,
44 const std::string& method) {
45 if (!g_dbus_statistics)
46 return;
47 g_dbus_statistics->AddStat(service, interface, method, TYPE_SENT);
48 }
49
50 // static
51 void DbusStatistics::AddReceivedCall(const std::string& service,
52 const std::string& interface,
53 const std::string& method) {
54 if (!g_dbus_statistics)
55 return;
56 g_dbus_statistics->AddStat(service, interface, method, TYPE_RECEIVED);
57 }
58
59 // static
60 std::string DbusStatistics::GetAsString(ShowInString show,
61 bool show_per_minute) {
62 if (!g_dbus_statistics)
63 return "DbusStatistics not intitialized.";
64
65 StatSet& stats = g_dbus_statistics->stats_;
satorux1 2012/11/12 00:40:43 const StatSet& ?
stevenjb 2012/11/12 19:46:40 Done.
66 if (stats.empty())
67 return "No DBus calls.";
68
69 base::TimeDelta dtime = base::Time::Now() - g_dbus_statistics->start_time_;
70 int dminutes = dtime.InMinutes();
71 dminutes = std::max(dminutes, 1);
72
73 std::string result;
74 int sent = 0, received = 0;
75 // Stats are stored in order by service, then interface, then method.
76 for (StatSet::const_iterator iter = stats.begin(); iter != stats.end(); ) {
77 StatSet::const_iterator cur_iter = iter++;
78 const Stat* stat = *cur_iter;
79 sent += stat->sent_calls;
80 received += stat->received_calls;
81 // If this is the last stat, or if the next stat should be on a different
82 // line, add a line to the result and clear the counts.
83 if (iter == stats.end() ||
84 (*iter)->service != stat->service ||
85 (show >= SHOW_SERVICE && (*iter)->interface != stat->interface) ||
86 (show >= SHOW_METHOD && (*iter)->method != stat->method)) {
87 if (!sent && !received)
88 continue; // No stats collected for this line, skip it and continue.
89
90 std::string line;
91 if (show == SHOW_SERVICE) {
92 line += stat->service;
93 } else {
94 // The interface usually includes the service so don't show both.
95 line += stat->interface;
96 if (show >= SHOW_METHOD)
97 line += "." + stat->method;
98 }
99 if (sent) {
100 line += StringPrintf(": Sent: %d", sent);
101 if (show_per_minute)
102 line += StringPrintf(" (%d/min)", sent / dminutes);
103 }
104 if (received) {
105 line += StringPrintf(" Received: %d", received);
106 if (show_per_minute)
107 line += StringPrintf(" (%d/min)", received / dminutes);
108 }
109 result += line + "\n";
110 sent = 0;
111 received = 0;
112 }
113 }
114 return result;
115 }
116
117 // static
118 bool DbusStatistics::GetCallsForTesting(const std::string& service,
119 const std::string& interface,
120 const std::string& method,
121 int* sent,
122 int* received) {
123 if (!g_dbus_statistics)
124 return false;
125 Stat* stat = g_dbus_statistics->GetStat(service, interface, method, false);
126 if (!stat)
127 return false;
128 *sent = stat->sent_calls;
129 *received = stat->received_calls;
130 return true;
131 }
132
133 // Private methods
134
135 void DbusStatistics::AddStat(const std::string& service,
136 const std::string& interface,
137 const std::string& method,
138 StatType type) {
139 Stat* stat = GetStat(service, interface, method, true);
140 if (type == TYPE_SENT)
141 ++stat->sent_calls;
142 else if (type == TYPE_RECEIVED)
143 ++stat->received_calls;
144 else
145 NOTREACHED();
146 }
147
148 DbusStatistics::Stat* DbusStatistics::GetStat(const std::string& service,
149 const std::string& interface,
150 const std::string& method,
151 bool add_stat) {
152 scoped_ptr<Stat> stat(new Stat(service, interface, method));
153 StatSet::iterator found = stats_.find(stat.get());
154 if (found != stats_.end())
155 return *found;
156 if (!add_stat)
157 return NULL;
158 found = stats_.insert(stat.release()).first;
159 return *found;
160 }
161
162 //------------------------------------------------------------------------------
163 // DbusStatistics::Stat
164
165 DbusStatistics::Stat::Stat(const std::string& service,
166 const std::string& interface,
167 const std::string& method)
168 : service(service),
169 interface(interface),
170 method(method),
171 sent_calls(0),
172 received_calls(0) {
173 }
174
175 bool DbusStatistics::Stat::Compare(const Stat& other) const {
176 if (service != other.service)
177 return service < other.service;
178 if (interface != other.interface)
179 return interface < other.interface;
180 return method < other.method;
181 }
182
183 bool DbusStatistics::Stat::PtrCompare::operator()(Stat* lhs, Stat* rhs) const {
184 DCHECK(lhs != NULL && rhs != NULL);
185 return lhs->Compare(*rhs);
186 }
187
188 } // namespace dbus
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698