calculate kdbus timeout based on user timeout 79/85479/5
authorKonrad Lipinski <konrad.l@samsung.com>
Thu, 25 Aug 2016 09:07:26 +0000 (11:07 +0200)
committerKonrad Lipinski <konrad.l@samsung.com>
Wed, 31 Aug 2016 15:03:16 +0000 (17:03 +0200)
Change-Id: I9fd1720e5c2a1edaa1fcd66b78df0b0238e9ce9f

dbus/dbus-connection.c
dbus/dbus-message-internal.h
dbus/dbus-message-private.h
dbus/dbus-message.c
dbus/dbus-transport-kdbus.c

index 8392e10..9a5be33 100644 (file)
@@ -3471,6 +3471,7 @@ dbus_connection_send_with_reply (DBusConnection     *connection,
       return TRUE;
     }
 
+  _dbus_message_set_timeout_ms(message, timeout_milliseconds);
   pending = _dbus_pending_call_new_unlocked (connection,
                                              timeout_milliseconds,
                                              reply_handler_timeout);
index 88586b5..2db5d85 100644 (file)
@@ -50,6 +50,8 @@ typedef struct DBusMessageLoader DBusMessageLoader;
 void _dbus_message_get_network_data  (DBusMessage       *message,
                                      const DBusString **header,
                                      const DBusString **body);
+void _dbus_message_set_timeout_ms(DBusMessage *message, int timeout_ms);
+int _dbus_message_get_timeout_ms(DBusMessage const *message);
 DBUS_PRIVATE_EXPORT
 void _dbus_message_get_unix_fds      (DBusMessage *message,
                                       const int **fds,
index 801b143..13ea36a 100644 (file)
@@ -113,6 +113,7 @@ struct DBusMessage
 
   DBusList *counters;   /**< 0-N DBusCounter used to track message size/unix fds. */
   long size_counter_delta;   /**< Size we incremented the size counters by.   */
+  int timeout_ms;
 
   dbus_uint32_t changed_stamp : CHANGED_STAMP_BITS; /**< Incremented when iterators are invalidated. */
 
index e058b7a..0e3f323 100644 (file)
@@ -293,6 +293,13 @@ _dbus_message_get_network_data (DBusMessage          *message,
   *body = &message->body;
 }
 
+void _dbus_message_set_timeout_ms(DBusMessage *message, int timeout_ms) {
+  message->timeout_ms = timeout_ms;
+}
+int _dbus_message_get_timeout_ms(DBusMessage const *message) {
+  return message->timeout_ms;
+}
+
 /**
  * Gets the unix fds to be sent over the network for this message.
  * This function is guaranteed to always return the same data once a
@@ -1359,6 +1366,7 @@ dbus_message_new_empty_header (dbus_bool_t gvariant)
 #endif
   message->counters = NULL;
   message->size_counter_delta = 0;
+  message->timeout_ms = -1;
   message->changed_stamp = 0;
 
 #ifdef HAVE_UNIX_FD_PASSING
index 591df86..39a8842 100755 (executable)
@@ -102,7 +102,7 @@ int debug = -1;
              ((uint8_t *)(iter) < (uint8_t *)(first) + (_size)) &&      \
                ((uint8_t *)(iter) >= (uint8_t *)(first));               \
              iter = (void*)(((uint8_t *)iter) + ALIGN8((iter)->size)))
-#define KDBUS_DEFAULT_TIMEOUT_NS   50000000000LLU
+#define KDBUS_INFINITE_TIMEOUT_NS   0x3fffffffffffffffLLU
 
 /**
  * @defgroup DBusTransportKdbus DBusTransport implementations for kdbus
@@ -770,12 +770,18 @@ kdbus_write_msg_internal (DBusTransportKdbus  *transport,
       else                                    /* method calls */
         {
           long tv_sec, tv_usec;
+          int timeout_ms = _dbus_message_get_timeout_ms(message);
 
           _dbus_get_monotonic_time (&tv_sec, &tv_usec);
                                            /* ms        us        ns */
-          timeout_ns_or_cookie_reply = (dbus_uint64_t)tv_sec * 1000ULL * 1000ULL * 1000ULL
-                                       + tv_usec * 1000ULL
-                                       + KDBUS_DEFAULT_TIMEOUT_NS;
+          timeout_ns_or_cookie_reply = 1U | ( /* ensure nonzero */
+                                         (dbus_uint64_t)tv_sec * 1000ULL * 1000ULL * 1000ULL
+                                         + tv_usec * 1000ULL + (
+                                           timeout_ms == -1 ? _DBUS_DEFAULT_TIMEOUT_VALUE * 1000000LLU :
+                                           timeout_ms == DBUS_TIMEOUT_INFINITE ? KDBUS_INFINITE_TIMEOUT_NS :
+                                           (uint64_t)timeout_ms * 1000000U
+                                         )
+                                       );
 
           flags |= KDBUS_MSG_EXPECT_REPLY;
         }
@@ -3111,24 +3117,8 @@ kdbus_decode_kernel_message (const struct kdbus_msg *msg,
         {
           case KDBUS_ITEM_REPLY_TIMEOUT:
           case KDBUS_ITEM_REPLY_DEAD:
-            {
-              DBusMessage *message = NULL;
-              _dbus_verbose ("  +%s (%llu bytes) cookie=%llu\n",
-                            enum_MSG (item->type), item->size, msg->cookie_reply);
-
-              message = _dbus_generate_local_error_message (msg->cookie_reply,
-                      item->type == KDBUS_ITEM_REPLY_TIMEOUT ? DBUS_ERROR_NO_REPLY : DBUS_ERROR_NAME_HAS_NO_OWNER, NULL);
-              if (message == NULL)
-                {
-                  ret_size = -1;
-                  goto out;
-                }
-
-              dbus_message_set_serial (message, get_next_client_serial (kdbus_transport));
-
-              if (!add_message_to_received (message, kdbus_transport->base.connection))
-                ret_size = -1;
-            }
+            _dbus_verbose ("  +%s (%llu bytes) cookie=%llu\n",
+                          enum_MSG (item->type), item->size, msg->cookie_reply);
             break;
 
           case KDBUS_ITEM_NAME_ADD: