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