summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schanda <schanda@itestra.de>2013-03-06 16:35:29 +0100
committerJohannes Schanda <schanda@itestra.de>2013-03-06 16:35:38 +0100
commit103de8bd9c0afe82ddfb130072fde37db83c5978 (patch)
tree91ac4ddbf67cb72fdd48aad423586fd2444a055e
parent78ef498d23f448b077d7726011bc640cb9f4afc6 (diff)
downloadgenivi-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.cpp5
-rw-r--r--src/CommonAPI/DBus/DBusConnection.h2
-rw-r--r--src/test/DBusMultipleConnectionTest.cpp1
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;