]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-netlink: make calc_elapse() return USEC_INFINITY when no timeout is requested
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 1 Oct 2023 03:04:52 +0000 (12:04 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 1 Oct 2023 03:41:10 +0000 (12:41 +0900)
Then, timout_compare() becomes simplar, the timeout value becomes
consistent with what sd_netlink_get_timeout() provides.

This also drop unnecessary assignment of reply_callback.timeout after
the slot is dropped from the prioq.

src/libsystemd/sd-netlink/netlink-slot.c
src/libsystemd/sd-netlink/sd-netlink.c

index b237db3c2f8e0a945c19db07054aeb6f70a54f5d..d85d2cd2f4069af3cbf079fd25dc7e6bc8f0bf67 100644 (file)
@@ -63,7 +63,7 @@ void netlink_slot_disconnect(sd_netlink_slot *slot, bool unref) {
         case NETLINK_REPLY_CALLBACK:
                 (void) hashmap_remove(nl->reply_callbacks, &slot->reply_callback.serial);
 
-                if (slot->reply_callback.timeout != 0)
+                if (slot->reply_callback.timeout != USEC_INFINITY)
                         prioq_remove(nl->reply_callbacks_prioq, &slot->reply_callback, &slot->reply_callback.prioq_idx);
 
                 break;
index ce0687eb57a29e077bf871765ebc26ea3830f5a2..6028d24c380db6eff4406fe7283c19ef9a795b6e 100644 (file)
@@ -215,7 +215,6 @@ static int process_timeout(sd_netlink *nl) {
                 return r;
 
         assert_se(prioq_pop(nl->reply_callbacks_prioq) == c);
-        c->timeout = 0;
         hashmap_remove(nl->reply_callbacks, UINT32_TO_PTR(c->serial));
 
         slot = container_of(c, sd_netlink_slot, reply_callback);
@@ -248,10 +247,8 @@ static int process_reply(sd_netlink *nl, sd_netlink_message *m) {
         if (!c)
                 return 0;
 
-        if (c->timeout != 0) {
+        if (c->timeout != USEC_INFINITY)
                 prioq_remove(nl->reply_callbacks_prioq, c, &c->prioq_idx);
-                c->timeout = 0;
-        }
 
         r = sd_netlink_message_get_type(m, &type);
         if (r < 0)
@@ -380,10 +377,7 @@ int sd_netlink_process(sd_netlink *nl, sd_netlink_message **ret) {
         return r;
 }
 
-static usec_t calc_elapse(uint64_t usec) {
-        if (usec == UINT64_MAX)
-                return 0;
-
+static usec_t timespan_to_timestamp(usec_t usec) {
         if (usec == 0)
                 usec = NETLINK_DEFAULT_TIMEOUT_USEC;
 
@@ -442,12 +436,6 @@ int sd_netlink_wait(sd_netlink *nl, uint64_t timeout_usec) {
 static int timeout_compare(const void *a, const void *b) {
         const struct reply_callback *x = a, *y = b;
 
-        if (x->timeout != 0 && y->timeout == 0)
-                return -1;
-
-        if (x->timeout == 0 && y->timeout != 0)
-                return 1;
-
         return CMP(x->timeout, y->timeout);
 }
 
@@ -487,7 +475,7 @@ int sd_netlink_call_async(
                 return r;
 
         slot->reply_callback.callback = callback;
-        slot->reply_callback.timeout = calc_elapse(usec);
+        slot->reply_callback.timeout = timespan_to_timestamp(usec);
 
         k = sd_netlink_send(nl, m, &slot->reply_callback.serial);
         if (k < 0)
@@ -497,7 +485,7 @@ int sd_netlink_call_async(
         if (r < 0)
                 return r;
 
-        if (slot->reply_callback.timeout != 0) {
+        if (slot->reply_callback.timeout != USEC_INFINITY) {
                 r = prioq_put(nl->reply_callbacks_prioq, &slot->reply_callback, &slot->reply_callback.prioq_idx);
                 if (r < 0) {
                         (void) hashmap_remove(nl->reply_callbacks, UINT32_TO_PTR(slot->reply_callback.serial));
@@ -528,7 +516,7 @@ int sd_netlink_read(
         assert_return(nl, -EINVAL);
         assert_return(!netlink_pid_changed(nl), -ECHILD);
 
-        timeout = calc_elapse(usec);
+        timeout = timespan_to_timestamp(usec);
 
         for (;;) {
                 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
@@ -567,7 +555,7 @@ int sd_netlink_read(
                         /* received message, so try to process straight away */
                         continue;
 
-                if (timeout > 0) {
+                if (timeout != USEC_INFINITY) {
                         usec_t n;
 
                         n = now(CLOCK_MONOTONIC);