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