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

Side by Side Diff: dbus/dbus_statistics.cc

Issue 2402893002: Update dbus_statistics to use C++11 more effectively, remove obsolete stl_util use. (Closed)
Patch Set: fix Created 4 years, 2 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
« no previous file with comments | « no previous file | 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) 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 "dbus/dbus_statistics.h" 5 #include "dbus/dbus_statistics.h"
6 6
7 #include <map>
7 #include <memory> 8 #include <memory>
8 #include <set> 9 #include <tuple>
9 10
10 #include "base/logging.h" 11 #include "base/logging.h"
11 #include "base/macros.h" 12 #include "base/macros.h"
12 #include "base/stl_util.h" 13 #include "base/memory/ptr_util.h"
13 #include "base/strings/stringprintf.h" 14 #include "base/strings/stringprintf.h"
14 #include "base/threading/platform_thread.h" 15 #include "base/threading/platform_thread.h"
15 #include "base/time/time.h" 16 #include "base/time/time.h"
16 17
17 namespace dbus { 18 namespace dbus {
18 19
19 namespace { 20 namespace {
20 21
21 // Used to store dbus statistics sorted alphabetically by service, interface, 22 // Used to store dbus statistics sorted alphabetically by service, interface,
22 // then method (using std::string <). 23 // then method (using std::string <).
23 struct Stat { 24 struct Stat {
24 Stat(const std::string& service, 25 Stat(const std::string& service,
25 const std::string& interface, 26 const std::string& interface,
26 const std::string& method) 27 const std::string& method)
27 : service(service), 28 : service(service),
28 interface(interface), 29 interface(interface),
29 method(method), 30 method(method),
30 sent_method_calls(0), 31 sent_method_calls(0),
31 received_signals(0), 32 received_signals(0),
32 sent_blocking_method_calls(0) { 33 sent_blocking_method_calls(0) {
33 } 34 }
34 std::string service; 35 std::string service;
35 std::string interface; 36 std::string interface;
36 std::string method; 37 std::string method;
37 int sent_method_calls; 38 int sent_method_calls;
38 int received_signals; 39 int received_signals;
39 int sent_blocking_method_calls; 40 int sent_blocking_method_calls;
40 41
41 bool Compare(const Stat& other) const {
42 if (service != other.service)
43 return service < other.service;
44 if (interface != other.interface)
45 return interface < other.interface;
46 return method < other.method;
47 }
48
49 struct PtrCompare { 42 struct PtrCompare {
50 bool operator()(Stat* lhs, Stat* rhs) const { 43 bool operator()(Stat* lhs, Stat* rhs) const {
51 DCHECK(lhs && rhs); 44 DCHECK(lhs && rhs);
52 return lhs->Compare(*rhs); 45 return std::tie(lhs->service, lhs->interface, lhs->method) <
46 std::tie(rhs->service, rhs->interface, rhs->method);
53 } 47 }
54 }; 48 };
55 }; 49 };
56 50
57 typedef std::set<Stat*, Stat::PtrCompare> StatSet; 51 using StatSet = std::map<Stat*, std::unique_ptr<Stat>, Stat::PtrCompare>;
satorux1 2016/10/11 01:29:58 why was it changed from set to map? if it's a map
Avi (use Gerrit) 2016/10/11 16:31:46 In doing the conversions I've been switching becau
58 52
59 //------------------------------------------------------------------------------ 53 //------------------------------------------------------------------------------
60 // DBusStatistics 54 // DBusStatistics
61 55
62 // Simple class for gathering DBus usage statistics. 56 // Simple class for gathering DBus usage statistics.
63 class DBusStatistics { 57 class DBusStatistics {
64 public: 58 public:
65 DBusStatistics() 59 DBusStatistics()
66 : start_time_(base::Time::Now()), 60 : start_time_(base::Time::Now()),
67 origin_thread_id_(base::PlatformThread::CurrentId()) { 61 origin_thread_id_(base::PlatformThread::CurrentId()) {
68 } 62 }
69 63
70 ~DBusStatistics() { 64 ~DBusStatistics() {
71 DCHECK_EQ(origin_thread_id_, base::PlatformThread::CurrentId()); 65 DCHECK_EQ(origin_thread_id_, base::PlatformThread::CurrentId());
72 base::STLDeleteContainerPointers(stats_.begin(), stats_.end());
73 } 66 }
74 67
75 // Enum to specify which field in Stat to increment in AddStat 68 // Enum to specify which field in Stat to increment in AddStat
76 enum StatType { 69 enum StatType {
77 TYPE_SENT_METHOD_CALLS, 70 TYPE_SENT_METHOD_CALLS,
78 TYPE_RECEIVED_SIGNALS, 71 TYPE_RECEIVED_SIGNALS,
79 TYPE_SENT_BLOCKING_METHOD_CALLS 72 TYPE_SENT_BLOCKING_METHOD_CALLS
80 }; 73 };
81 74
82 // Add a call to |method| for |interface|. See also MethodCall in message.h. 75 // Add a call to |method| for |interface|. See also MethodCall in message.h.
(...skipping 18 matching lines...) Expand all
101 NOTREACHED(); 94 NOTREACHED();
102 } 95 }
103 96
104 // Look up the Stat entry in |stats_|. If |add_stat| is true, add a new entry 97 // Look up the Stat entry in |stats_|. If |add_stat| is true, add a new entry
105 // if one does not already exist. 98 // if one does not already exist.
106 Stat* GetStat(const std::string& service, 99 Stat* GetStat(const std::string& service,
107 const std::string& interface, 100 const std::string& interface,
108 const std::string& method, 101 const std::string& method,
109 bool add_stat) { 102 bool add_stat) {
110 DCHECK_EQ(origin_thread_id_, base::PlatformThread::CurrentId()); 103 DCHECK_EQ(origin_thread_id_, base::PlatformThread::CurrentId());
111 std::unique_ptr<Stat> stat(new Stat(service, interface, method)); 104 std::unique_ptr<Stat> stat =
112 StatSet::iterator found = stats_.find(stat.get()); 105 base::MakeUnique<Stat>(service, interface, method);
106 auto found = stats_.find(stat.get());
113 if (found != stats_.end()) 107 if (found != stats_.end())
114 return *found; 108 return found->first;
115 if (!add_stat) 109 if (!add_stat)
116 return NULL; 110 return nullptr;
117 found = stats_.insert(stat.release()).first; 111 Stat* stat_ptr = stat.get();
118 return *found; 112 stats_[stat_ptr] = std::move(stat);
113 return stat_ptr;
119 } 114 }
120 115
121 StatSet& stats() { return stats_; } 116 StatSet& stats() { return stats_; }
122 base::Time start_time() { return start_time_; } 117 base::Time start_time() { return start_time_; }
123 118
124 private: 119 private:
125 StatSet stats_; 120 StatSet stats_;
126 base::Time start_time_; 121 base::Time start_time_;
127 base::PlatformThreadId origin_thread_id_; 122 base::PlatformThreadId origin_thread_id_;
128 123
129 DISALLOW_COPY_AND_ASSIGN(DBusStatistics); 124 DISALLOW_COPY_AND_ASSIGN(DBusStatistics);
130 }; 125 };
131 126
132 DBusStatistics* g_dbus_statistics = NULL; 127 DBusStatistics* g_dbus_statistics = nullptr;
133 128
134 } // namespace 129 } // namespace
135 130
136 //------------------------------------------------------------------------------ 131 //------------------------------------------------------------------------------
137 132
138 namespace statistics { 133 namespace statistics {
139 134
140 void Initialize() { 135 void Initialize() {
141 if (g_dbus_statistics) 136 if (g_dbus_statistics)
142 delete g_dbus_statistics; // reset statistics 137 delete g_dbus_statistics; // reset statistics
143 g_dbus_statistics = new DBusStatistics(); 138 g_dbus_statistics = new DBusStatistics();
144 } 139 }
145 140
146 void Shutdown() { 141 void Shutdown() {
147 delete g_dbus_statistics; 142 delete g_dbus_statistics;
148 g_dbus_statistics = NULL; 143 g_dbus_statistics = nullptr;
149 } 144 }
150 145
151 void AddSentMethodCall(const std::string& service, 146 void AddSentMethodCall(const std::string& service,
152 const std::string& interface, 147 const std::string& interface,
153 const std::string& method) { 148 const std::string& method) {
154 if (!g_dbus_statistics) 149 if (!g_dbus_statistics)
155 return; 150 return;
156 g_dbus_statistics->AddStat( 151 g_dbus_statistics->AddStat(
157 service, interface, method, DBusStatistics::TYPE_SENT_METHOD_CALLS); 152 service, interface, method, DBusStatistics::TYPE_SENT_METHOD_CALLS);
158 } 153 }
(...skipping 27 matching lines...) Expand all
186 if (stats.empty()) 181 if (stats.empty())
187 return "No DBus calls."; 182 return "No DBus calls.";
188 183
189 base::TimeDelta dtime = base::Time::Now() - g_dbus_statistics->start_time(); 184 base::TimeDelta dtime = base::Time::Now() - g_dbus_statistics->start_time();
190 int dminutes = dtime.InMinutes(); 185 int dminutes = dtime.InMinutes();
191 dminutes = std::max(dminutes, 1); 186 dminutes = std::max(dminutes, 1);
192 187
193 std::string result; 188 std::string result;
194 int sent = 0, received = 0, sent_blocking = 0; 189 int sent = 0, received = 0, sent_blocking = 0;
195 // Stats are stored in order by service, then interface, then method. 190 // Stats are stored in order by service, then interface, then method.
196 for (StatSet::const_iterator iter = stats.begin(); iter != stats.end(); ) { 191 for (auto iter = stats.begin(); iter != stats.end();) {
197 StatSet::const_iterator cur_iter = iter; 192 auto cur_iter = iter;
198 StatSet::const_iterator next_iter = ++iter; 193 auto next_iter = ++iter;
199 const Stat* stat = *cur_iter; 194 const Stat* stat = cur_iter->first;
200 sent += stat->sent_method_calls; 195 sent += stat->sent_method_calls;
201 received += stat->received_signals; 196 received += stat->received_signals;
202 sent_blocking += stat->sent_blocking_method_calls; 197 sent_blocking += stat->sent_blocking_method_calls;
203 // If this is not the last stat, and if the next stat matches the current 198 // If this is not the last stat, and if the next stat matches the current
204 // stat, continue. 199 // stat, continue.
205 if (next_iter != stats.end() && 200 if (next_iter != stats.end() &&
206 (*next_iter)->service == stat->service && 201 next_iter->first->service == stat->service &&
207 (show < SHOW_INTERFACE || (*next_iter)->interface == stat->interface) && 202 (show < SHOW_INTERFACE ||
208 (show < SHOW_METHOD || (*next_iter)->method == stat->method)) 203 next_iter->first->interface == stat->interface) &&
204 (show < SHOW_METHOD || next_iter->first->method == stat->method))
209 continue; 205 continue;
210 206
211 if (!sent && !received && !sent_blocking) 207 if (!sent && !received && !sent_blocking)
212 continue; // No stats collected for this line, skip it and continue. 208 continue; // No stats collected for this line, skip it and continue.
213 209
214 // Add a line to the result and clear the counts. 210 // Add a line to the result and clear the counts.
215 std::string line; 211 std::string line;
216 if (show == SHOW_SERVICE) { 212 if (show == SHOW_SERVICE) {
217 line += stat->service; 213 line += stat->service;
218 } else { 214 } else {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 *sent = stat->sent_method_calls; 271 *sent = stat->sent_method_calls;
276 *received = stat->received_signals; 272 *received = stat->received_signals;
277 *blocking = stat->sent_blocking_method_calls; 273 *blocking = stat->sent_blocking_method_calls;
278 return true; 274 return true;
279 } 275 }
280 276
281 } // namespace testing 277 } // namespace testing
282 278
283 } // namespace statistics 279 } // namespace statistics
284 } // namespace dbus 280 } // namespace dbus
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698