12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef DBUS_DBUS_STATISTICS_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define DBUS_DBUS_STATISTICS_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "dbus/dbus_export.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The functions defined here are used to gather DBus statistics, and 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// provide them in a format convenient for debugging. These functions are only 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// valid when called from the main thread (the thread which Initialize() was 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// called from). Calls from other threads will be ignored. 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace dbus { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace statistics { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Enum to specify what level of detail to show in GetAsString 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum ShowInString { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SHOW_SERVICE = 0, // Service totals only 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SHOW_INTERFACE = 1, // Service + interface totals 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SHOW_METHOD = 2, // Service + interface + method totals 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Enum to specify how to format the display in GetAsString 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum FormatString { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FORMAT_TOTALS = 0, // Raw totals only 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FORMAT_PER_MINUTE = 1, // Per-minute only 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FORMAT_ALL = 2 // Include all format details 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Initializes / shuts down dbus statistics gathering. Calling Initialize 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// more than once will reset the statistics. 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CHROME_DBUS_EXPORT void Initialize(); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CHROME_DBUS_EXPORT void Shutdown(); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Add sent/received calls to the statistics gathering class. These methods 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// do nothing unless Initialize() was called. 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CHROME_DBUS_EXPORT void AddSentMethodCall(const std::string& service, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& interface, 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& method); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CHROME_DBUS_EXPORT void AddReceivedSignal(const std::string& service, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& interface, 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& method); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Track synchronous calls independently since we want to highlight 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (and remove) these. 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CHROME_DBUS_EXPORT void AddBlockingSentMethodCall(const std::string& service, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& interface, 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& method); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Output the calls into a formatted string. |show| determines what level 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of detail to show: one line per service, per interface, or per method. 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// If |show_per_minute| is true include per minute stats. 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Example output for SHOW_METHOD, FORMAT_TOTALS: 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// org.chromium.Mtpd.EnumerateStorage: Sent: 100 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// org.chromium.Mtpd.MTPStorageSignal: Received: 20 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Example output for SHOW_INTERFACE, FORMAT_ALL: 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// org.chromium.Mtpd: Sent: 100 (10/min) Received: 20 (2/min) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CHROME_DBUS_EXPORT std::string GetAsString(ShowInString show, 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormatString format); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace testing { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sets |sent| to the number of sent calls, |received| to the number of 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// received calls, and |blocking| to the number of sent blocking calls for 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// service+interface+method. Used in unittests. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CHROME_DBUS_EXPORT bool GetCalls(const std::string& service, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& interface, 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& method, 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int* sent, 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int* received, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int* blocking); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace testing 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace statistics 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace dbus 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // DBUS_DBUS_STATISTICS_H_ 80