Skip to content

Commit

Permalink
dbus: Missing signals race
Browse files Browse the repository at this point in the history
It was possible when running the dbus in single thread mode that dbus
signals could get lost.

This was occurring due to a race in connecting to the signal vs when
the signal was posted. Since the ConnectToSignal would fire on a PostTask
but the processing of signals would happen directly this could cause
a situation where a signal was in the task queue but the
ConnectToSignalInternal call was after it.

BUG=451098

Review URL: https://codereview.chromium.org/868753003

Cr-Commit-Position: refs/heads/master@{#312843}
  • Loading branch information
dtapuska authored and Commit bot committed Jan 23, 2015
1 parent b390424 commit 663e4dc
Showing 1 changed file with 14 additions and 11 deletions.
25 changes: 14 additions & 11 deletions dbus/object_proxy.cc
Original file line number Diff line number Diff line change
Expand Up @@ -168,17 +168,20 @@ void ObjectProxy::ConnectToSignal(const std::string& interface_name,
OnConnectedCallback on_connected_callback) {
bus_->AssertOnOriginThread();

base::PostTaskAndReplyWithResult(
bus_->GetDBusTaskRunner(),
FROM_HERE,
base::Bind(&ObjectProxy::ConnectToSignalInternal,
this,
interface_name,
signal_name,
signal_callback),
base::Bind(on_connected_callback,
interface_name,
signal_name));
if (bus_->HasDBusThread()) {
base::PostTaskAndReplyWithResult(
bus_->GetDBusTaskRunner(), FROM_HERE,
base::Bind(&ObjectProxy::ConnectToSignalInternal, this, interface_name,
signal_name, signal_callback),
base::Bind(on_connected_callback, interface_name, signal_name));
} else {
// If the bus doesn't have a dedicated dbus thread we need to call
// ConnectToSignalInternal directly otherwise we might miss a signal
// that is currently queued if we do a PostTask.
const bool success =
ConnectToSignalInternal(interface_name, signal_name, signal_callback);
on_connected_callback.Run(interface_name, signal_name, success);
}
}

void ObjectProxy::SetNameOwnerChangedCallback(
Expand Down

0 comments on commit 663e4dc

Please sign in to comment.