summaryrefslogtreecommitdiff
path: root/src/CommonAPI/DBus
diff options
context:
space:
mode:
authorPhilip Rauwolf <rauwolf@itestra.de>2013-03-01 12:49:35 +0100
committerPhilip Rauwolf <rauwolf@itestra.de>2013-03-01 12:50:07 +0100
commit29104467eb05f92c5688477d1d7fdb18da2b04ec (patch)
treed2f22e564097d303f0d3abf0cdec61c7661d95dc /src/CommonAPI/DBus
parente53fc484061f14cf3ecf4679bdec7314cafbf590 (diff)
downloadgenivi-common-api-dbus-runtime-29104467eb05f92c5688477d1d7fdb18da2b04ec.tar.gz
Fixed occasional deadlock that occurred when dbus connection got
destroyed
Diffstat (limited to 'src/CommonAPI/DBus')
-rw-r--r--src/CommonAPI/DBus/DBusConnection.cpp11
-rw-r--r--src/CommonAPI/DBus/DBusServiceRegistry.cpp21
-rw-r--r--src/CommonAPI/DBus/DBusServiceRegistry.h4
3 files changed, 21 insertions, 15 deletions
diff --git a/src/CommonAPI/DBus/DBusConnection.cpp b/src/CommonAPI/DBus/DBusConnection.cpp
index e0a32e0..68af24c 100644
--- a/src/CommonAPI/DBus/DBusConnection.cpp
+++ b/src/CommonAPI/DBus/DBusConnection.cpp
@@ -92,15 +92,16 @@ bool DBusConnection::connect(DBusError& dbusError) {
void DBusConnection::disconnect() {
if (isConnected()) {
- stopDispatching_ = true;
-
if (!dbusSignalMatchRulesMap_.empty()) {
dbus_connection_remove_filter(libdbusConnection_, &onLibdbusSignalFilterThunk, this);
}
+ dbus_connection_close(libdbusConnection_);
+
+ stopDispatching_ = true;
+
dispatchThread_.join();
- dbus_connection_close(libdbusConnection_);
dbus_connection_unref(libdbusConnection_);
libdbusConnection_ = NULL;
@@ -119,8 +120,8 @@ DBusProxyConnection::ConnectionStatusEvent& DBusConnection::getConnectionStatusE
const std::shared_ptr<DBusServiceRegistry> DBusConnection::getDBusServiceRegistry() {
std::shared_ptr<DBusServiceRegistry> serviceRegistry = dbusServiceRegistry_.lock();
if (!serviceRegistry) {
- auto blub = this->shared_from_this();
- serviceRegistry = std::make_shared<DBusServiceRegistry>(blub);
+ serviceRegistry = std::make_shared<DBusServiceRegistry>(this->shared_from_this());
+ serviceRegistry->init();
dbusServiceRegistry_ = serviceRegistry;
}
diff --git a/src/CommonAPI/DBus/DBusServiceRegistry.cpp b/src/CommonAPI/DBus/DBusServiceRegistry.cpp
index f883797..a54116c 100644
--- a/src/CommonAPI/DBus/DBusServiceRegistry.cpp
+++ b/src/CommonAPI/DBus/DBusServiceRegistry.cpp
@@ -16,25 +16,28 @@ namespace DBus {
DBusServiceRegistry::DBusServiceRegistry(std::shared_ptr<DBusProxyConnection> dbusProxyConnection):
dbusDaemonProxy_(std::make_shared<CommonAPI::DBus::DBusDaemonProxy>(dbusProxyConnection)),
dbusServicesStatus_(AvailabilityStatus::UNKNOWN) {
+}
+
+DBusServiceRegistry::~DBusServiceRegistry() {
+ dbusDaemonProxy_->getNameOwnerChangedEvent().unsubscribe(dbusDaemonProxyNameOwnerChangedEventSubscription_);
+ dbusDaemonProxy_->getProxyStatusEvent().unsubscribe(dbusDaemonProxyStatusEventSubscription_);
+ std::cout << "Crushing stuff" << std::endl;
+}
+void DBusServiceRegistry::init() {
dbusDaemonProxyStatusEventSubscription_ =
dbusDaemonProxy_->getProxyStatusEvent().subscribeCancellableListener(
- std::bind(&DBusServiceRegistry::onDBusDaemonProxyStatusEvent, this, std::placeholders::_1));
+ std::bind(&DBusServiceRegistry::onDBusDaemonProxyStatusEvent, this->shared_from_this(), std::placeholders::_1));
dbusDaemonProxyNameOwnerChangedEventSubscription_ =
dbusDaemonProxy_->getNameOwnerChangedEvent().subscribeCancellableListener(
std::bind(&DBusServiceRegistry::onDBusDaemonProxyNameOwnerChangedEvent,
- this,
+ this->shared_from_this(),
std::placeholders::_1,
std::placeholders::_2,
std::placeholders::_3));
}
-DBusServiceRegistry::~DBusServiceRegistry() {
- dbusDaemonProxy_->getNameOwnerChangedEvent().unsubscribe(dbusDaemonProxyNameOwnerChangedEventSubscription_);
- dbusDaemonProxy_->getProxyStatusEvent().unsubscribe(dbusDaemonProxyStatusEventSubscription_);
-}
-
bool DBusServiceRegistry::waitDBusServicesAvailable(std::unique_lock<std::mutex>& lock, std::chrono::milliseconds& timeout) {
bool dbusServicesStatusIsKnown = (dbusServicesStatus_ != AvailabilityStatus::UNKNOWN);
@@ -324,7 +327,7 @@ SubscriptionStatus DBusServiceRegistry::onDBusDaemonProxyStatusEvent(const Avail
dbusServicesStatus_ = AvailabilityStatus::UNKNOWN;
dbusDaemonProxy_->listNamesAsync(std::bind(
&DBusServiceRegistry::onListNamesCallback,
- this,
+ this->shared_from_this(),
std::placeholders::_1,
std::placeholders::_2));
break;
@@ -478,7 +481,7 @@ void DBusServiceRegistry::resolveDBusServiceInstances(DBusServiceList::iterator&
// search for remote instances
DBusDaemonProxy::GetManagedObjectsAsyncCallback callback = std::bind(&DBusServiceRegistry::onGetManagedObjectsCallback,
- this,
+ this->shared_from_this(),
std::placeholders::_1,
std::placeholders::_2,
dbusServiceName);
diff --git a/src/CommonAPI/DBus/DBusServiceRegistry.h b/src/CommonAPI/DBus/DBusServiceRegistry.h
index 1db2dfd..510c339 100644
--- a/src/CommonAPI/DBus/DBusServiceRegistry.h
+++ b/src/CommonAPI/DBus/DBusServiceRegistry.h
@@ -42,7 +42,7 @@ class DBusProxyConnection;
class DBusDaemonProxy;
-class DBusServiceRegistry {
+class DBusServiceRegistry: public std::enable_shared_from_this<DBusServiceRegistry> {
public:
enum class DBusServiceState {
UNKNOWN,
@@ -65,6 +65,8 @@ class DBusServiceRegistry {
virtual ~DBusServiceRegistry();
+ void init();
+
bool isServiceInstanceAlive(const std::string& dbusInterfaceName, const std::string& dbusConnectionName, const std::string& dbusObjectPath);
Subscription subscribeAvailabilityListener(const std::string& commonApiAddress,