From 103de8bd9c0afe82ddfb130072fde37db83c5978 Mon Sep 17 00:00:00 2001 From: Johannes Schanda Date: Wed, 6 Mar 2013 16:35:29 +0100 Subject: Fix two rare segfaults in connection signal and disconnect, improve timing in multiple connection test --- src/CommonAPI/DBus/DBusConnection.cpp | 5 ++++- src/CommonAPI/DBus/DBusConnection.h | 2 ++ src/test/DBusMultipleConnectionTest.cpp | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) 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 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 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 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 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_; std::shared_ptr 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 proxyFactory; -- cgit v1.2.1