1ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Use of this source code is governed by a BSD-style license that can be
3ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// found in the LICENSE file.
4ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
5ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#ifndef DBUS_DBUS_STATISTICS_H_
6ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#define DBUS_DBUS_STATISTICS_H_
7ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
8ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include <string>
9ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
10ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include "dbus/dbus_export.h"
11ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
12ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// The functions defined here are used to gather DBus statistics, and
13ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// provide them in a format convenient for debugging. These functions are only
14ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// valid when called from the main thread (the thread which Initialize() was
15ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// called from). Calls from other threads will be ignored.
16ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
17ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratnamespace dbus {
18ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratnamespace statistics {
19ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
20ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Enum to specify what level of detail to show in GetAsString
21ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratenum ShowInString {
22ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  SHOW_SERVICE = 0,  // Service totals only
23ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  SHOW_INTERFACE = 1,  // Service + interface totals
24ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  SHOW_METHOD = 2,  // Service + interface + method totals
25ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat};
26ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
27ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Enum to specify how to format the display in GetAsString
28ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratenum FormatString {
29ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  FORMAT_TOTALS = 0,  // Raw totals only
30ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  FORMAT_PER_MINUTE = 1,  // Per-minute only
31ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  FORMAT_ALL = 2  // Include all format details
32ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat};
33ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
34ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Initializes / shuts down dbus statistics gathering. Calling Initialize
35ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// more than once will reset the statistics.
36ae6a045d2239408e25198ad17e2413bdde105788Daniel EratCHROME_DBUS_EXPORT void Initialize();
37ae6a045d2239408e25198ad17e2413bdde105788Daniel EratCHROME_DBUS_EXPORT void Shutdown();
38ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
39ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Add sent/received calls to the statistics gathering class. These methods
40ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// do nothing unless Initialize() was called.
41ae6a045d2239408e25198ad17e2413bdde105788Daniel EratCHROME_DBUS_EXPORT void AddSentMethodCall(const std::string& service,
42ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                          const std::string& interface,
43ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                          const std::string& method);
44ae6a045d2239408e25198ad17e2413bdde105788Daniel EratCHROME_DBUS_EXPORT void AddReceivedSignal(const std::string& service,
45ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                          const std::string& interface,
46ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                          const std::string& method);
47ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Track synchronous calls independently since we want to highlight
48ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// (and remove) these.
49ae6a045d2239408e25198ad17e2413bdde105788Daniel EratCHROME_DBUS_EXPORT void AddBlockingSentMethodCall(const std::string& service,
50ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                                  const std::string& interface,
51ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                                  const std::string& method);
52ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
53ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Output the calls into a formatted string. |show| determines what level
54ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// of detail to show: one line per service, per interface, or per method.
55ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// If |show_per_minute| is true include per minute stats.
56ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Example output for SHOW_METHOD, FORMAT_TOTALS:
57ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   org.chromium.Mtpd.EnumerateStorage: Sent: 100
58ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   org.chromium.Mtpd.MTPStorageSignal: Received: 20
59ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Example output for SHOW_INTERFACE, FORMAT_ALL:
60ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   org.chromium.Mtpd: Sent: 100 (10/min) Received: 20 (2/min)
61ae6a045d2239408e25198ad17e2413bdde105788Daniel EratCHROME_DBUS_EXPORT std::string GetAsString(ShowInString show,
62ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                           FormatString format);
63ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
64ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratnamespace testing {
65ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Sets |sent| to the number of sent calls, |received| to the number of
66ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// received calls, and |blocking| to the number of sent blocking calls for
67ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// service+interface+method. Used in unittests.
68ae6a045d2239408e25198ad17e2413bdde105788Daniel EratCHROME_DBUS_EXPORT bool GetCalls(const std::string& service,
69ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                 const std::string& interface,
70ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                 const std::string& method,
71ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                 int* sent,
72ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                 int* received,
73ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                 int* blocking);
74ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat}  // namespace testing
75ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
76ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat}  // namespace statistics
77ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat}  // namespace dbus
78ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
79ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#endif  // DBUS_DBUS_STATISTICS_H_
80