aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Vakulenko <avakulenko@google.com>2015-10-15 13:04:06 -0700
committerAlex Vakulenko <avakulenko@google.com>2015-10-15 13:04:06 -0700
commitc662a247b77b7252424e3ab5e1d56917a092d259 (patch)
tree2618ca7b96d6416d4af08cede30c94d7d8320576
parent6765efdf49f824c98d13afefe920bdee237e1c0f (diff)
downloadweaved-c662a247b77b7252424e3ab5e1d56917a092d259.tar.gz
Delay registering D-Bus object until Weave device is started
Otherwise daemons can start updating device state before webserver notified us of HTTP port numbers and we start the libweave, which would lead to a crash Change-Id: I928477078da633def0bd00f165d39dd8b8dfc4c5
-rw-r--r--buffet/manager.cc10
-rw-r--r--buffet/manager.h1
2 files changed, 9 insertions, 2 deletions
diff --git a/buffet/manager.cc b/buffet/manager.cc
index 37cebe5..3fe7a7d 100644
--- a/buffet/manager.cc
+++ b/buffet/manager.cc
@@ -147,8 +147,8 @@ void Manager::Start(AsyncEventSequencer* sequencer) {
RestartWeave(sequencer);
dbus_adaptor_.RegisterWithDBusObject(&dbus_object_);
- dbus_object_.RegisterAsync(
- sequencer->GetHandler("Manager.RegisterAsync() failed.", true));
+ dbus_registration_handler_ =
+ sequencer->GetHandler("Manager.RegisterAsync() failed.", true);
}
void Manager::RestartWeave(AsyncEventSequencer* sequencer) {
@@ -214,6 +214,12 @@ void Manager::CreateDevice() {
device_->AddPairingChangedCallbacks(
base::Bind(&Manager::OnPairingStart, weak_ptr_factory_.GetWeakPtr()),
base::Bind(&Manager::OnPairingEnd, weak_ptr_factory_.GetWeakPtr()));
+
+ auto handler = dbus_registration_handler_;
+ if (handler.is_null())
+ handler = AsyncEventSequencer::GetDefaultCompletionAction();
+ dbus_object_.RegisterAsync(handler);
+ dbus_registration_handler_.Reset();
}
void Manager::Stop() {
diff --git a/buffet/manager.h b/buffet/manager.h
index 2dc06e8..33a782f 100644
--- a/buffet/manager.h
+++ b/buffet/manager.h
@@ -113,6 +113,7 @@ class Manager final : public com::android::Weave::ManagerInterface {
std::unique_ptr<WebServClient> web_serv_client_;
std::unique_ptr<weave::Device> device_;
std::unique_ptr<DBusCommandDispacher> command_dispatcher_;
+ brillo::dbus_utils::AsyncEventSequencer::Handler dbus_registration_handler_;
base::WeakPtrFactory<Manager> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(Manager);