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

Unified Diff: dbus/dbus_statistics.cc

Issue 11761015: Make DBusStatistics only run on the main thread (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Additional CHECK Created 7 years, 12 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: dbus/dbus_statistics.cc
diff --git a/dbus/dbus_statistics.cc b/dbus/dbus_statistics.cc
index 015e20ea61c769896940ea4bfc7071da677fec3a..448407e8b9cc4a84b1c21d64992e6ac11789323d 100644
--- a/dbus/dbus_statistics.cc
+++ b/dbus/dbus_statistics.cc
@@ -6,10 +6,15 @@
#include <set>
+#include "base/bind.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
+#include "base/memory/weak_ptr.h"
+#include "base/message_loop.h"
+#include "base/message_loop_proxy.h"
#include "base/stl_util.h"
#include "base/stringprintf.h"
+#include "base/threading/platform_thread.h"
#include "base/time.h"
namespace dbus {
@@ -60,10 +65,17 @@ typedef std::set<Stat*, Stat::PtrCompare> StatSet;
// Simple class for gathering DBus usage statistics.
class DBusStatistics {
public:
- DBusStatistics() : start_time_(base::Time::Now()) {
+ DBusStatistics()
+ : start_time_(base::Time::Now()),
+ origin_thread_id_(base::PlatformThread::CurrentId()),
+ ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) {
+ // MessageLoop::current() might be NULL in tests.
hashimoto 2013/01/04 11:20:10 How about setting up the message loop in tests ins
stevenjb 2013/01/04 20:30:37 Replacing this with a CHECK fails for a handful of
hashimoto 2013/01/07 13:28:00 OK. Please fix the failing browser tests.
+ if (MessageLoop::current())
+ origin_message_loop_proxy_ = MessageLoop::current()->message_loop_proxy();
hashimoto 2013/01/04 11:20:10 nit: How about using MessageLoopProxy::current()?
stevenjb 2013/01/04 20:30:37 Done.
}
~DBusStatistics() {
+ CHECK_EQ(origin_thread_id_, base::PlatformThread::CurrentId());
STLDeleteContainerPointers(stats_.begin(), stats_.end());
}
@@ -79,8 +91,18 @@ class DBusStatistics {
const std::string& interface,
const std::string& method,
StatType type) {
+ if (base::PlatformThread::CurrentId() != origin_thread_id_) {
hashimoto 2013/01/04 11:20:10 How about using SingleThreadTaskRunner:: BelongsTo
stevenjb 2013/01/04 20:30:37 As long as origin_message_loop_proxy_ might be NUL
+ if (origin_message_loop_proxy_.get()) {
+ origin_message_loop_proxy_->PostTask(
+ FROM_HERE,
+ base::Bind(&DBusStatistics::AddStat,
+ weak_ptr_factory_.GetWeakPtr(),
+ service, interface, method, type));
+ }
+ return;
+ }
Stat* stat = GetStat(service, interface, method, true);
- DCHECK(stat);
+ CHECK(stat);
if (type == TYPE_SENT_METHOD_CALLS)
++stat->sent_method_calls;
else if (type == TYPE_RECEIVED_SIGNALS)
@@ -97,6 +119,7 @@ class DBusStatistics {
const std::string& interface,
const std::string& method,
bool add_stat) {
+ CHECK_EQ(origin_thread_id_, base::PlatformThread::CurrentId());
scoped_ptr<Stat> stat(new Stat(service, interface, method));
StatSet::iterator found = stats_.find(stat.get());
if (found != stats_.end())
@@ -107,12 +130,18 @@ class DBusStatistics {
return *found;
}
- StatSet& stats() { return stats_; }
+ StatSet& GetStatSet() {
+ CHECK_EQ(origin_thread_id_, base::PlatformThread::CurrentId());
+ return stats_;
+ }
base::Time start_time() { return start_time_; }
private:
StatSet stats_;
base::Time start_time_;
+ base::PlatformThreadId origin_thread_id_;
+ scoped_refptr<base::MessageLoopProxy> origin_message_loop_proxy_;
+ base::WeakPtrFactory<DBusStatistics> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(DBusStatistics);
};
@@ -170,7 +199,7 @@ std::string GetAsString(ShowInString show, FormatString format) {
if (!g_dbus_statistics)
return "DBusStatistics not initialized.";
- const StatSet& stats = g_dbus_statistics->stats();
+ const StatSet& stats = g_dbus_statistics->GetStatSet();
if (stats.empty())
return "No DBus calls.";
« 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