From c662a247b77b7252424e3ab5e1d56917a092d259 Mon Sep 17 00:00:00 2001 From: Alex Vakulenko Date: Thu, 15 Oct 2015 13:04:06 -0700 Subject: 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 --- buffet/manager.cc | 10 ++++++++-- 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 web_serv_client_; std::unique_ptr device_; std::unique_ptr command_dispatcher_; + brillo::dbus_utils::AsyncEventSequencer::Handler dbus_registration_handler_; base::WeakPtrFactory weak_ptr_factory_{this}; DISALLOW_COPY_AND_ASSIGN(Manager); -- cgit v1.2.3