summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Rauwolf <rauwolf@itestra.de>2013-03-19 10:35:39 +0100
committerPhilip Rauwolf <rauwolf@itestra.de>2013-03-19 10:35:39 +0100
commit8502749512b58b6567ebc0121b3b29019a6125a3 (patch)
tree498344b6ab3f8c2d5031ed8582afd54f137a9265
parent198a5c06daad32b212ad33e5dbde877fd4ead41c (diff)
downloadgenivi-common-api-dbus-runtime-8502749512b58b6567ebc0121b3b29019a6125a3.tar.gz
Prevented independent double instantiation of DBusObjectManager and
DBusServiceRegistry within the DBusConnection. Also prevented access to the not-yet-instantiated DBusObjectManager member variable of DBusConnection when an external call arrives "too early".
-rw-r--r--src/CommonAPI/DBus/DBusConnection.cpp22
-rw-r--r--src/CommonAPI/DBus/DBusConnection.h4
2 files changed, 18 insertions, 8 deletions
diff --git a/src/CommonAPI/DBus/DBusConnection.cpp b/src/CommonAPI/DBus/DBusConnection.cpp
index acc0b3e..3f98c0b 100644
--- a/src/CommonAPI/DBus/DBusConnection.cpp
+++ b/src/CommonAPI/DBus/DBusConnection.cpp
@@ -149,9 +149,13 @@ DBusProxyConnection::ConnectionStatusEvent& DBusConnection::getConnectionStatusE
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;
@@ -159,7 +163,11 @@ const std::shared_ptr<DBusServiceRegistry> DBusConnection::getDBusServiceRegistr
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_;
@@ -531,7 +539,7 @@ void DBusConnection::initLibdbusSignalFilterAfterConnect() {
resumeDispatching();
}
-::DBusHandlerResult DBusConnection::onLibdbusObjectPathMessage(::DBusMessage* libdbusMessage) const {
+::DBusHandlerResult DBusConnection::onLibdbusObjectPathMessage(::DBusMessage* libdbusMessage) {
assert(libdbusMessage);
// handle only method call messages
@@ -539,7 +547,7 @@ void DBusConnection::initLibdbusSignalFilterAfterConnect() {
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;
}
@@ -607,7 +615,7 @@ void DBusConnection::initLibdbusSignalFilterAfterConnect() {
assert(libdbusMessage);
assert(userData);
- const DBusConnection* dbusConnection = reinterpret_cast<DBusConnection*>(userData);
+ DBusConnection* dbusConnection = reinterpret_cast<DBusConnection*>(userData);
assert(dbusConnection->libdbusConnection_ == libdbusConnection);
diff --git a/src/CommonAPI/DBus/DBusConnection.h b/src/CommonAPI/DBus/DBusConnection.h
index d6a7314..2f7923f 100644
--- a/src/CommonAPI/DBus/DBusConnection.h
+++ b/src/CommonAPI/DBus/DBusConnection.h
@@ -122,7 +122,7 @@ class DBusConnection: public DBusProxyConnection, public std::enable_shared_from
void initLibdbusSignalFilterAfterConnect();
- ::DBusHandlerResult onLibdbusObjectPathMessage(::DBusMessage* libdbusMessage) const;
+ ::DBusHandlerResult onLibdbusObjectPathMessage(::DBusMessage* libdbusMessage);
::DBusHandlerResult onLibdbusSignalFilter(::DBusMessage* libdbusMessage);
@@ -142,6 +142,8 @@ class DBusConnection: public DBusProxyConnection, public std::enable_shared_from
::DBusConnection* libdbusConnection_;
std::mutex libdbusConnectionGuard_;
std::mutex signalGuard_;
+ std::mutex objectManagerGuard_;
+ std::mutex serviceRegistryGuard_;
std::weak_ptr<DBusServiceRegistry> dbusServiceRegistry_;
std::shared_ptr<DBusObjectManager> dbusObjectManager_;