diff options
author | Johannes Schanda <schanda@itestra.de> | 2013-03-06 16:35:29 +0100 |
---|---|---|
committer | Johannes Schanda <schanda@itestra.de> | 2013-03-06 16:35:38 +0100 |
commit | 103de8bd9c0afe82ddfb130072fde37db83c5978 (patch) | |
tree | 91ac4ddbf67cb72fdd48aad423586fd2444a055e | |
parent | 78ef498d23f448b077d7726011bc640cb9f4afc6 (diff) | |
download | genivi-common-api-dbus-runtime-103de8bd9c0afe82ddfb130072fde37db83c5978.tar.gz |
Fix two rare segfaults in connection signal and disconnect,gpt_6_1_pre
improve timing in multiple connection test
-rw-r--r-- | src/CommonAPI/DBus/DBusConnection.cpp | 5 | ||||
-rw-r--r-- | src/CommonAPI/DBus/DBusConnection.h | 2 | ||||
-rw-r--r-- | src/test/DBusMultipleConnectionTest.cpp | 1 |
3 files changed, 7 insertions, 1 deletions
diff --git a/src/CommonAPI/DBus/DBusConnection.cpp b/src/CommonAPI/DBus/DBusConnection.cpp index 4404d96..4b4c406 100644 --- a/src/CommonAPI/DBus/DBusConnection.cpp +++ b/src/CommonAPI/DBus/DBusConnection.cpp @@ -92,6 +92,7 @@ bool DBusConnection::connect(DBusError& dbusError) { } void DBusConnection::disconnect() { + std::lock_guard<std::mutex> dbusConnectionLock(libdbusConnectionGuard_); if (isConnected()) { if (!dbusSignalMatchRulesMap_.empty()) { dbus_connection_remove_filter(libdbusConnection_, &onLibdbusSignalFilterThunk, this); @@ -276,8 +277,8 @@ DBusProxyConnection::DBusSignalHandlerToken DBusConnection::addSignalMemberHandl interfaceName, interfaceMemberName, interfaceMemberSignature); + std::lock_guard<std::mutex> dbusSignalLock(signalGuard_); const bool isFirstSignalMemberHandler = dbusSignalHandlerTable_.find(dbusSignalHandlerPath) == dbusSignalHandlerTable_.end(); - dbusSignalHandlerTable_.insert(DBusSignalHandlerTable::value_type(dbusSignalHandlerPath, dbusSignalHandler)); if (isFirstSignalMemberHandler) { @@ -288,6 +289,7 @@ DBusProxyConnection::DBusSignalHandlerToken DBusConnection::addSignalMemberHandl } void DBusConnection::removeSignalMemberHandler(const DBusSignalHandlerToken& dbusSignalHandlerToken) { + std::lock_guard<std::mutex> dbusSignalLock(signalGuard_); auto equalRangeIteratorPair = dbusSignalHandlerTable_.equal_range(dbusSignalHandlerToken); // the range can't be empty! @@ -522,6 +524,7 @@ void DBusConnection::initLibdbusSignalFilterAfterConnect() { assert(interfaceMemberName); assert(interfaceMemberSignature); + std::lock_guard<std::mutex> dbusSignalLock(signalGuard_); DBusSignalHandlerPath dbusSignalHandlerPath(objectPath, interfaceName, interfaceMemberName, interfaceMemberSignature); auto equalRangeIteratorPair = dbusSignalHandlerTable_.equal_range(dbusSignalHandlerPath); diff --git a/src/CommonAPI/DBus/DBusConnection.h b/src/CommonAPI/DBus/DBusConnection.h index 454d2b1..8e95296 100644 --- a/src/CommonAPI/DBus/DBusConnection.h +++ b/src/CommonAPI/DBus/DBusConnection.h @@ -134,6 +134,8 @@ class DBusConnection: public DBusProxyConnection, public std::enable_shared_from BusType busType_; ::DBusConnection* libdbusConnection_; + std::mutex libdbusConnectionGuard_; + std::mutex signalGuard_; std::weak_ptr<DBusServiceRegistry> dbusServiceRegistry_; std::shared_ptr<DBusObjectManager> dbusObjectManager_; diff --git a/src/test/DBusMultipleConnectionTest.cpp b/src/test/DBusMultipleConnectionTest.cpp index 70af765..a0cc497 100644 --- a/src/test/DBusMultipleConnectionTest.cpp +++ b/src/test/DBusMultipleConnectionTest.cpp @@ -44,6 +44,7 @@ class DBusMultipleConnectionTest: public ::testing::Test { virtual void TearDown() { stubFactory->unregisterService(serviceAddress); + sleep(1); } std::shared_ptr<CommonAPI::Factory> proxyFactory; |