summaryrefslogtreecommitdiffstats
path: root/dbus/object_proxy.cc
diff options
context:
space:
mode:
authorharuki@chromium.org <haruki@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-14 11:02:59 +0000
committerharuki@chromium.org <haruki@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-14 11:02:59 +0000
commit6d36c0cadfc825db5336a04c1c0778ebe2652a92 (patch)
tree451eecc45061e3bc58c02deb20032a37d49c733f /dbus/object_proxy.cc
parent8a2e513493bd5b0d2eb8e068975efc2e91fb5250 (diff)
downloadchromium_src-6d36c0cadfc825db5336a04c1c0778ebe2652a92.zip
chromium_src-6d36c0cadfc825db5336a04c1c0778ebe2652a92.tar.gz
chromium_src-6d36c0cadfc825db5336a04c1c0778ebe2652a92.tar.bz2
Make SignalSenderVerificationTest more robust
Add more assertions and a callback to check the result of RequestOwnership. Original test can hang when test_service2_ tries to acquire the ownership before D-Bus recognizes test_service_'s disconnection. In that situation, test_service2_ cannot own the name and cannot send a message. BUG=158689 TEST=unittests Review URL: https://chromiumcodereview.appspot.com/11358111 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@167649 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'dbus/object_proxy.cc')
-rw-r--r--dbus/object_proxy.cc23
1 files changed, 20 insertions, 3 deletions
diff --git a/dbus/object_proxy.cc b/dbus/object_proxy.cc
index c8f00d7..5e9bf5b 100644
--- a/dbus/object_proxy.cc
+++ b/dbus/object_proxy.cc
@@ -408,6 +408,12 @@ void ObjectProxy::OnConnected(OnConnectedCallback on_connected_callback,
on_connected_callback.Run(interface_name, signal_name, success);
}
+void ObjectProxy::SetNameOwnerChangedCallback(SignalCallback callback) {
+ bus_->AssertOnOriginThread();
+
+ name_owner_changed_callback_ = callback;
+}
+
DBusHandlerResult ObjectProxy::HandleMessage(
DBusConnection* connection,
DBusMessage* raw_message) {
@@ -430,7 +436,7 @@ DBusHandlerResult ObjectProxy::HandleMessage(
if (path.value() == kDbusSystemObjectPath &&
signal->GetMember() == "NameOwnerChanged") {
// Handle NameOwnerChanged separately
- return HandleNameOwnerChanged(signal.get());
+ return HandleNameOwnerChanged(signal.Pass());
}
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
@@ -619,7 +625,8 @@ void ObjectProxy::UpdateNameOwnerAndBlock() {
service_name_owner_.clear();
}
-DBusHandlerResult ObjectProxy::HandleNameOwnerChanged(Signal* signal) {
+DBusHandlerResult ObjectProxy::HandleNameOwnerChanged(
+ scoped_ptr<Signal> signal) {
DCHECK(signal);
bus_->AssertOnDBusThread();
@@ -627,13 +634,23 @@ DBusHandlerResult ObjectProxy::HandleNameOwnerChanged(Signal* signal) {
if (signal->GetMember() == "NameOwnerChanged" &&
signal->GetInterface() == "org.freedesktop.DBus" &&
signal->GetSender() == "org.freedesktop.DBus") {
- MessageReader reader(signal);
+ MessageReader reader(signal.get());
std::string name, old_owner, new_owner;
if (reader.PopString(&name) &&
reader.PopString(&old_owner) &&
reader.PopString(&new_owner) &&
name == service_name_) {
service_name_owner_ = new_owner;
+ if (!name_owner_changed_callback_.is_null()) {
+ const base::TimeTicks start_time = base::TimeTicks::Now();
+ Signal* released_signal = signal.release();
+ bus_->PostTaskToOriginThread(FROM_HERE,
+ base::Bind(&ObjectProxy::RunMethod,
+ this,
+ start_time,
+ name_owner_changed_callback_,
+ released_signal));
+ }
return DBUS_HANDLER_RESULT_HANDLED;
}
}