summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Rauwolf <rauwolf@itestra.de>2013-03-20 11:26:47 +0100
committerPhilip Rauwolf <rauwolf@itestra.de>2013-03-20 11:26:47 +0100
commit537846e44bbf0ee2ce8c2bc34a49a2d056d86606 (patch)
treec182013efd0314085162e8a6fd5a6ff3f495d433
parent2b0abd9ce1bec9a73df55ab87be613a260358a8b (diff)
downloadgenivi-common-api-dbus-runtime-537846e44bbf0ee2ce8c2bc34a49a2d056d86606.tar.gz
Bugfix: Prevented concurrent modification within DBusObjectManager
-rw-r--r--src/CommonAPI/DBus/DBusObjectManager.cpp17
-rw-r--r--src/CommonAPI/DBus/DBusObjectManager.h3
2 files changed, 16 insertions, 4 deletions
diff --git a/src/CommonAPI/DBus/DBusObjectManager.cpp b/src/CommonAPI/DBus/DBusObjectManager.cpp
index 57c0727..0f5b484 100644
--- a/src/CommonAPI/DBus/DBusObjectManager.cpp
+++ b/src/CommonAPI/DBus/DBusObjectManager.cpp
@@ -24,11 +24,15 @@ DBusInterfaceHandlerToken DBusObjectManager::registerInterfaceHandler(const std:
const std::string& interfaceName,
const DBusMessageInterfaceHandler& dbusMessageInterfaceHandler) {
DBusInterfaceHandlerPath handlerPath(objectPath, interfaceName);
+
+ objectPathLock_.lock();
bool noSuchHandlerRegistered = dbusRegisteredObjectsTable_.find(handlerPath) == dbusRegisteredObjectsTable_.end();
assert(noSuchHandlerRegistered);
dbusRegisteredObjectsTable_.insert({handlerPath, dbusMessageInterfaceHandler});
+ objectPathLock_.unlock();
+
std::shared_ptr<DBusConnection> lockedConnection = dbusConnection_.lock();
if(lockedConnection) {
lockedConnection->registerObjectPath(objectPath);
@@ -38,6 +42,7 @@ DBusInterfaceHandlerToken DBusObjectManager::registerInterfaceHandler(const std:
}
void DBusObjectManager::unregisterInterfaceHandler(const DBusInterfaceHandlerToken& dbusInterfaceHandlerToken) {
+ objectPathLock_.lock();
const std::string& objectPath = dbusInterfaceHandlerToken.first;
std::shared_ptr<DBusConnection> lockedConnection = dbusConnection_.lock();
@@ -46,9 +51,10 @@ void DBusObjectManager::unregisterInterfaceHandler(const DBusInterfaceHandlerTok
}
dbusRegisteredObjectsTable_.erase(dbusInterfaceHandlerToken);
+ objectPathLock_.unlock();
}
-bool DBusObjectManager::handleMessage(const DBusMessage& dbusMessage) const {
+bool DBusObjectManager::handleMessage(const DBusMessage& dbusMessage) {
const char* objectPath = dbusMessage.getObjectPath();
const char* interfaceName = dbusMessage.getInterfaceName();
@@ -56,6 +62,8 @@ bool DBusObjectManager::handleMessage(const DBusMessage& dbusMessage) const {
assert(interfaceName);
DBusInterfaceHandlerPath handlerPath(objectPath, interfaceName);
+
+ objectPathLock_.lock();
auto handlerIterator = dbusRegisteredObjectsTable_.find(handlerPath);
const bool foundDBusInterfaceHandler = handlerIterator != dbusRegisteredObjectsTable_.end();
bool dbusMessageHandled = false;
@@ -64,13 +72,12 @@ bool DBusObjectManager::handleMessage(const DBusMessage& dbusMessage) const {
const DBusMessageInterfaceHandler& interfaceHandlerDBusMessageHandler = handlerIterator->second;
dbusMessageHandled = interfaceHandlerDBusMessageHandler(dbusMessage);
}
+ objectPathLock_.unlock();
return dbusMessageHandled;
}
bool DBusObjectManager::onGetDBusObjectManagerData(const DBusMessage& callMessage) {
- DBusDaemonProxy::DBusObjectToInterfaceDict dictToSend;
-
const char* interfaceName = callMessage.getInterfaceName();
const char* signature = callMessage.getSignatureString();
@@ -78,6 +85,9 @@ bool DBusObjectManager::onGetDBusObjectManagerData(const DBusMessage& callMessag
assert(!strcmp(signature, ""));
assert(callMessage.getType() == DBusMessage::Type::MethodCall);
+ DBusDaemonProxy::DBusObjectToInterfaceDict dictToSend;
+
+ objectPathLock_.lock();
auto registeredObjectsIterator = dbusRegisteredObjectsTable_.begin();
while(registeredObjectsIterator != dbusRegisteredObjectsTable_.end()) {
@@ -92,6 +102,7 @@ bool DBusObjectManager::onGetDBusObjectManagerData(const DBusMessage& callMessag
++registeredObjectsIterator;
}
+ objectPathLock_.unlock();
const char* getManagedObjectsDBusSignature = "a{oa{sa{sv}}}";
DBusMessage replyMessage = callMessage.createMethodReturn(getManagedObjectsDBusSignature);
diff --git a/src/CommonAPI/DBus/DBusObjectManager.h b/src/CommonAPI/DBus/DBusObjectManager.h
index bfd2a71..6c3f1b2 100644
--- a/src/CommonAPI/DBus/DBusObjectManager.h
+++ b/src/CommonAPI/DBus/DBusObjectManager.h
@@ -36,7 +36,7 @@ class DBusObjectManager {
void unregisterInterfaceHandler(const DBusInterfaceHandlerToken& dbusInterfaceHandlerToken);
- bool handleMessage(const DBusMessage&) const;
+ bool handleMessage(const DBusMessage&);
private:
@@ -49,6 +49,7 @@ class DBusObjectManager {
DBusRegisteredObjectsTable dbusRegisteredObjectsTable_;
std::weak_ptr<DBusConnection> dbusConnection_;
+ std::recursive_mutex objectPathLock_;
};
} // namespace DBus