Unregister DBusObject callback when the object is destroyed

Without that cleanup, DBusConnection might try to call a dangling
std::function in case the DBusObject was removed before. That is for
example happening during shutdown.
This commit is contained in:
Roland Winklmeier
2018-10-19 14:50:55 +02:00
committed by Klaus Basan
parent dfd33e40c1
commit f8cc92341a
3 changed files with 21 additions and 9 deletions

View File

@@ -99,9 +99,16 @@ namespace XSwiftBus
return m_connection && dbus_connection_get_is_connected(m_connection.get());
}
void CDBusConnection::registerDisconnectedCallback(DisconnectedCallback func)
void CDBusConnection::registerDisconnectedCallback(CDBusObject *obj, DisconnectedCallback func)
{
m_disconnectedCallbacks.push_back(func);
m_disconnectedCallbacks[obj] = func;
}
void CDBusConnection::unregisterDisconnectedCallback(CDBusObject *obj)
{
auto it = m_disconnectedCallbacks.find(obj);
if (it == m_disconnectedCallbacks.end()) { return; }
m_disconnectedCallbacks.erase(it);
}
void CDBusConnection::registerObjectPath(CDBusObject *object, const std::string &interfaceName, const std::string &objectPath, const DBusObjectPathVTable &dbusObjectPathVTable)
@@ -166,9 +173,9 @@ namespace XSwiftBus
if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected"))
{
for (const auto &cb : obj->m_disconnectedCallbacks)
for (auto it = obj->m_disconnectedCallbacks.begin(); it != obj->m_disconnectedCallbacks.end(); ++it)
{
cb();
it->second();
}
return DBUS_HANDLER_RESULT_HANDLED;
}