Prevented dispatch mechanism from returning into an undefined
authorPhilip Rauwolf <rauwolf@itestra.de>
Mon, 11 Mar 2013 14:12:26 +0000 (15:12 +0100)
committerPhilip Rauwolf <rauwolf@itestra.de>
Mon, 11 Mar 2013 14:12:26 +0000 (15:12 +0100)
(already destructed) environment.

src/CommonAPI/DBus/DBusConnection.cpp
src/CommonAPI/DBus/DBusConnection.h

index d151854..fa712bb 100644 (file)
@@ -29,9 +29,17 @@ DBusObjectPathVTable DBusConnection::libdbusObjectPathVTable_ = {
                 &DBusConnection::onLibdbusObjectPathMessageThunk
 };
 
-void DBusConnection::dispatch() {
-    while (!stopDispatching_ && readWriteDispatch(10)) {
+void DBusConnection::dispatch(std::shared_ptr<DBusConnection> selfReference) {
+    while (!stopDispatching_ && readWriteDispatch(10) && (selfReference.use_count() > 1)) {}
+}
+
+bool DBusConnection::readWriteDispatch(int timeoutMilliseconds) {
+    if(isConnected()) {
+        const dbus_bool_t libdbusSuccess = dbus_connection_read_write_dispatch(libdbusConnection_,
+                                                                               timeoutMilliseconds);
+        return libdbusSuccess;
     }
+    return false;
 }
 
 DBusConnection::DBusConnection(BusType busType) :
@@ -51,9 +59,7 @@ DBusConnection::DBusConnection(::DBusConnection* libDbusConnection) :
 }
 
 DBusConnection::~DBusConnection() {
-    if (isConnected()) {
-        disconnect();
-    }
+    disconnect();
 }
 
 bool DBusConnection::connect() {
@@ -82,7 +88,7 @@ bool DBusConnection::connect(DBusError& dbusError) {
     initLibdbusSignalFilterAfterConnect();
 
     stopDispatching_ = false;
-    dispatchThread_ = std::thread(std::bind(&DBusConnection::dispatch, this));
+    dispatchThread_ = std::thread(&DBusConnection::dispatch, this, this->shared_from_this());
 
     dbusConnectionStatusEvent_.notifyListeners(AvailabilityStatus::AVAILABLE);
 
@@ -257,16 +263,6 @@ DBusMessage DBusConnection::sendDBusMessageWithReplyAndBlock(const DBusMessage&
     return DBusMessage(libdbusMessageReply, increaseLibdbusMessageReferenceCount);
 }
 
-
-bool DBusConnection::readWriteDispatch(int timeoutMilliseconds) {
-    if(isConnected()) {
-        const dbus_bool_t libdbusSuccess = dbus_connection_read_write_dispatch(libdbusConnection_,
-                                                                               timeoutMilliseconds);
-        return libdbusSuccess;
-    }
-    return false;
-}
-
 DBusProxyConnection::DBusSignalHandlerToken DBusConnection::addSignalMemberHandler(const std::string& objectPath,
                                                                                    const std::string& interfaceName,
                                                                                    const std::string& interfaceMemberName,
index a9c1044..44f9afe 100644 (file)
@@ -99,7 +99,7 @@ class DBusConnection: public DBusProxyConnection, public std::enable_shared_from
     virtual const std::shared_ptr<DBusObjectManager> getDBusObjectManager();
 
  private:
-    void dispatch();
+    void dispatch(std::shared_ptr<DBusConnection> selfReference);
 
     std::thread dispatchThread_;
     bool stopDispatching_;