Prevented independent double instantiation of DBusObjectManager and
authorPhilip Rauwolf <rauwolf@itestra.de>
Tue, 19 Mar 2013 09:35:39 +0000 (10:35 +0100)
committerPhilip Rauwolf <rauwolf@itestra.de>
Tue, 19 Mar 2013 09:35:39 +0000 (10:35 +0100)
DBusServiceRegistry within the DBusConnection. Also prevented access
to the not-yet-instantiated DBusObjectManager member variable of
DBusConnection when an external call arrives "too early".

src/CommonAPI/DBus/DBusConnection.cpp
src/CommonAPI/DBus/DBusConnection.h

index acc0b3e..3f98c0b 100644 (file)
@@ -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);
 
index d6a7314..2f7923f 100644 (file)
@@ -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_;