diff options
author | Alex Vakulenko <avakulenko@google.com> | 2015-10-15 13:04:06 -0700 |
---|---|---|
committer | Alex Vakulenko <avakulenko@google.com> | 2015-10-15 13:04:06 -0700 |
commit | c662a247b77b7252424e3ab5e1d56917a092d259 (patch) | |
tree | 2618ca7b96d6416d4af08cede30c94d7d8320576 | |
parent | 6765efdf49f824c98d13afefe920bdee237e1c0f (diff) | |
download | weaved-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.cc | 10 | ||||
-rw-r--r-- | buffet/manager.h | 1 |
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); |