diff options
author | Philip Rauwolf <rauwolf@itestra.de> | 2013-03-19 10:35:39 +0100 |
---|---|---|
committer | Philip Rauwolf <rauwolf@itestra.de> | 2013-03-19 10:35:39 +0100 |
commit | 8502749512b58b6567ebc0121b3b29019a6125a3 (patch) | |
tree | 498344b6ab3f8c2d5031ed8582afd54f137a9265 | |
parent | 198a5c06daad32b212ad33e5dbde877fd4ead41c (diff) | |
download | genivi-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.cpp | 22 | ||||
-rw-r--r-- | src/CommonAPI/DBus/DBusConnection.h | 4 |
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_; |