Fix a bug with new interface signals
When creating new objects, Defer sending of interface added
signals until all interfaces have been created.
Change-Id: I031846861bb8f569be054e1d0303810fc0dd6ba6
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/manager.cpp b/manager.cpp
index 4f56e7a..264037f 100644
--- a/manager.cpp
+++ b/manager.cpp
@@ -148,8 +148,11 @@
// a container.
InterfaceComposite ref;
+ auto i = object.size();
for (auto& x : object)
{
+ // Defer sending any signals until the last interface.
+ auto deferSignals = --i != 0;
auto maker = _makers.find(x.first.c_str());
if (maker == _makers.end())
@@ -157,7 +160,7 @@
"Unimplemented interface: " + x.first);
ref.emplace(x.first,
- (maker->second)(_bus, path.str.c_str()));
+ (maker->second)(_bus, path.str.c_str(), deferSignals));
}
if (!ref.empty())
diff --git a/manager.hpp b/manager.hpp
index 0c89017..2ffa47b 100644
--- a/manager.hpp
+++ b/manager.hpp
@@ -35,7 +35,7 @@
template <typename T>
struct MakeInterface
{
- static auto make(sdbusplus::bus::bus& bus, const char* path)
+ static auto make(sdbusplus::bus::bus& bus, const char* path, bool deferSignals)
{
using HolderType = holder::Holder<std::unique_ptr<T>>;
return static_cast<std::unique_ptr<holder::Base>>(
@@ -43,7 +43,8 @@
std::forward<std::unique_ptr<T>>(
std::make_unique<T>(
std::forward<decltype(bus)>(bus),
- std::forward<decltype(path)>(path)))));
+ std::forward<decltype(path)>(path),
+ std::forward<decltype(deferSignals)>(deferSignals)))));
}
};
} // namespace details
@@ -140,7 +141,7 @@
using ObjectReferences = std::map<std::string, InterfaceComposite>;
using Events = std::vector<EventInfo>;
using MakerType = HolderPtr(*)(
- sdbusplus::bus::bus&, const char*);
+ sdbusplus::bus::bus&, const char*, bool);
using Makers = std::map<std::string, MakerType>;
/** @brief Provides weak references to interface holders.