[systemd-commits] src/udev

David Herrmann dvdhrm at kemper.freedesktop.org
Sat Apr 11 03:37:26 PDT 2015


 src/udev/udevadm-settle.c |    6 ++++++
 1 file changed, 6 insertions(+)

New commits:
commit 0736455b1186c9515e0f093e1e686e684d225787
Author: Nir Soffer <nirsof at gmail.com>
Date:   Wed Apr 8 04:04:16 2015 +0300

    udev: restore udevadm settle timeout
    
    Commit 9ea28c55a2 (udev: remove seqnum API and all assumptions about
    seqnums) introduced a regresion, ignoring the timeout option when
    waiting until the event queue is empty.
    
    Previously, if the udev event queue was not empty when the timeout was
    expired, udevadm settle was returning with exit code 1.  To check if the
    queue is empty, you could invoke udevadm settle with timeout=0. This
    patch restores the previous behavior.
    
    (David: fixed timeout==0 handling and dropped redundant assignment)

diff --git a/src/udev/udevadm-settle.c b/src/udev/udevadm-settle.c
index 0d3025e..2c84ada 100644
--- a/src/udev/udevadm-settle.c
+++ b/src/udev/udevadm-settle.c
@@ -49,6 +49,7 @@ static int adm_settle(struct udev *udev, int argc, char *argv[]) {
                 { "quiet",          no_argument,       NULL, 'q' }, /* removed */
                 {}
         };
+        usec_t deadline;
         const char *exists = NULL;
         unsigned int timeout = 120;
         struct pollfd pfd[1] = { {.fd = -1}, };
@@ -98,6 +99,8 @@ static int adm_settle(struct udev *udev, int argc, char *argv[]) {
                 return EXIT_FAILURE;
         }
 
+        deadline = now(CLOCK_MONOTONIC) + timeout * USEC_PER_SEC;
+
         /* guarantee that the udev daemon isn't pre-processing */
         if (getuid() == 0) {
                 struct udev_ctrl *uctrl;
@@ -139,6 +142,9 @@ static int adm_settle(struct udev *udev, int argc, char *argv[]) {
                         break;
                 }
 
+                if (timeout > 0 && now(CLOCK_MONOTONIC) >= deadline)
+                        break;
+
                 /* wake up when queue is empty */
                 if (poll(pfd, 1, MSEC_PER_SEC) > 0 && pfd[0].revents & POLLIN)
                         udev_queue_flush(queue);



More information about the systemd-commits mailing list