mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-05 01:05:34 +08:00
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:
committed by
Klaus Basan
parent
dfd33e40c1
commit
f8cc92341a
@@ -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;
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
#include <dbus/dbus.h>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
|
||||
namespace XSwiftBus
|
||||
@@ -64,7 +63,10 @@ namespace XSwiftBus
|
||||
bool isConnected() const;
|
||||
|
||||
//! Register a disconnected callback
|
||||
void registerDisconnectedCallback(DisconnectedCallback func);
|
||||
void registerDisconnectedCallback(CDBusObject *obj, DisconnectedCallback func);
|
||||
|
||||
//! Register a disconnected callback
|
||||
void unregisterDisconnectedCallback(CDBusObject *obj);
|
||||
|
||||
//! Register DBus object with interfaceName and objectPath.
|
||||
//! \param object
|
||||
@@ -98,7 +100,7 @@ namespace XSwiftBus
|
||||
CDBusDispatcher *m_dispatcher = nullptr;
|
||||
std::unique_ptr<DBusConnection, DBusConnectionDeleter> m_connection;
|
||||
CDBusError m_lastError;
|
||||
std::vector<DisconnectedCallback> m_disconnectedCallbacks;
|
||||
std::unordered_map<CDBusObject *, DisconnectedCallback> m_disconnectedCallbacks;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -15,14 +15,17 @@ namespace XSwiftBus
|
||||
CDBusObject::CDBusObject()
|
||||
{ }
|
||||
|
||||
CDBusObject::~CDBusObject() = default;
|
||||
CDBusObject::~CDBusObject()
|
||||
{
|
||||
m_dbusConnection->unregisterDisconnectedCallback(this);
|
||||
};
|
||||
|
||||
void CDBusObject::setDBusConnection(const std::shared_ptr<CDBusConnection> &dbusConnection)
|
||||
{
|
||||
m_dbusConnection = dbusConnection;
|
||||
dbusConnectedHandler();
|
||||
CDBusConnection::DisconnectedCallback disconnectedHandler = std::bind(&CDBusObject::dbusDisconnectedHandler, this);
|
||||
m_dbusConnection->registerDisconnectedCallback(disconnectedHandler);
|
||||
m_dbusConnection->registerDisconnectedCallback(this, disconnectedHandler);
|
||||
}
|
||||
|
||||
void CDBusObject::registerDBusObjectPath(const std::string &interfaceName, const std::string &objectPath)
|
||||
|
||||
Reference in New Issue
Block a user