Backport of fix for GLIPCI-165.
authorArnaud Fietzke <fietzke@itestra.de>
Thu, 21 Nov 2013 09:16:41 +0000 (10:16 +0100)
committerArnaud Fietzke <fietzke@itestra.de>
Tue, 26 Nov 2013 16:03:31 +0000 (17:03 +0100)
Once resumeDispatching() is called,
readWriteDispatch() may dispatch the
reply, causing replyAsyncHandler to
be deleted.

Conflicts:

src/CommonAPI/DBus/DBusConnection.cpp

src/CommonAPI/DBus/DBusConnection.cpp

index 3b58241..fc35997 100644 (file)
@@ -414,6 +414,7 @@ std::future<CallStatus> DBusConnection::sendDBusMessageWithReplyAsync(
     DBusPendingCall* libdbusPendingCall;
     dbus_bool_t libdbusSuccess;
 
+    suspendDispatching();
     libdbusSuccess = dbus_connection_send_with_reply(
                     libdbusConnection_,
                     dbusMessage.libdbusMessage_,
@@ -422,6 +423,7 @@ std::future<CallStatus> DBusConnection::sendDBusMessageWithReplyAsync(
 
     if (!libdbusSuccess || !libdbusPendingCall) {
        dbusMessageReplyAsyncHandler->onDBusMessageReply(CallStatus::CONNECTION_FAILED, dbusMessage);
+       resumeDispatching();
         return dbusMessageReplyAsyncHandler->getFuture();
     }
 
@@ -434,10 +436,15 @@ std::future<CallStatus> DBusConnection::sendDBusMessageWithReplyAsync(
     if (!libdbusSuccess) {
        dbusMessageReplyAsyncHandler->onDBusMessageReply(CallStatus::OUT_OF_MEMORY, dbusMessage);
         dbus_pending_call_unref(libdbusPendingCall);
+        resumeDispatching();
         return dbusMessageReplyAsyncHandler->getFuture();
     }
 
-    return dbusMessageReplyAsyncHandler.release()->getFuture();
+    std::future<CallStatus> result = dbusMessageReplyAsyncHandler.release()->getFuture();
+
+    resumeDispatching();
+
+    return result;
 }