const std::shared_ptr<DBusServiceRegistry> DBusConnection::getDBusServiceRegistry() {
std::shared_ptr<DBusServiceRegistry> serviceRegistry = dbusServiceRegistry_.lock();
if (!serviceRegistry || dbusServiceRegistry_.expired()) {
- serviceRegistry = std::make_shared<DBusServiceRegistry>(shared_from_this());
- serviceRegistry->init();
- dbusServiceRegistry_ = serviceRegistry;
+ serviceRegistryGuard_.lock();
+ if (!serviceRegistry || dbusServiceRegistry_.expired()) {
+ serviceRegistry = std::make_shared<DBusServiceRegistry>(shared_from_this());
+ serviceRegistry->init();
+ dbusServiceRegistry_ = serviceRegistry;
+ }
+ serviceRegistryGuard_.unlock();
}
return serviceRegistry;
const std::shared_ptr<DBusObjectManager> DBusConnection::getDBusObjectManager() {
if (!dbusObjectManager_) {
- dbusObjectManager_ = std::make_shared<DBusObjectManager>(shared_from_this());
+ objectManagerGuard_.lock();
+ if (!dbusObjectManager_) {
+ dbusObjectManager_ = std::make_shared<DBusObjectManager>(shared_from_this());
+ }
+ objectManagerGuard_.unlock();
}
return dbusObjectManager_;
resumeDispatching();
}
-::DBusHandlerResult DBusConnection::onLibdbusObjectPathMessage(::DBusMessage* libdbusMessage) const {
+::DBusHandlerResult DBusConnection::onLibdbusObjectPathMessage(::DBusMessage* libdbusMessage) {
assert(libdbusMessage);
// handle only method call messages
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
- bool isDBusMessageHandled = dbusObjectManager_->handleMessage(DBusMessage(libdbusMessage));
+ bool isDBusMessageHandled = getDBusObjectManager()->handleMessage(DBusMessage(libdbusMessage));
return isDBusMessageHandled ? DBUS_HANDLER_RESULT_HANDLED : DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
assert(libdbusMessage);
assert(userData);
- const DBusConnection* dbusConnection = reinterpret_cast<DBusConnection*>(userData);
+ DBusConnection* dbusConnection = reinterpret_cast<DBusConnection*>(userData);
assert(dbusConnection->libdbusConnection_ == libdbusConnection);
void initLibdbusSignalFilterAfterConnect();
- ::DBusHandlerResult onLibdbusObjectPathMessage(::DBusMessage* libdbusMessage) const;
+ ::DBusHandlerResult onLibdbusObjectPathMessage(::DBusMessage* libdbusMessage);
::DBusHandlerResult onLibdbusSignalFilter(::DBusMessage* libdbusMessage);
::DBusConnection* libdbusConnection_;
std::mutex libdbusConnectionGuard_;
std::mutex signalGuard_;
+ std::mutex objectManagerGuard_;
+ std::mutex serviceRegistryGuard_;
std::weak_ptr<DBusServiceRegistry> dbusServiceRegistry_;
std::shared_ptr<DBusObjectManager> dbusObjectManager_;