chiark / gitweb /
increase netif renaming timeout from 30 to 90 seconds
[elogind.git] / udev / udevd.c
index bc6484b1b0b55a17c6dc51e06313515dc8e1e715..9a278ce1f39023487edbbda54a5a2d9afe8f1d66 100644 (file)
@@ -59,6 +59,8 @@ static void log_fn(struct udev *udev, int priority,
        }
 }
 
+static void reap_sigchilds(void);
+
 static int debug_trace;
 static struct udev_rules *rules;
 static struct udev_ctrl *udev_ctrl;
@@ -403,6 +405,7 @@ static void event_queue_manager(struct udev *udev)
        struct udev_list_node *loop;
        struct udev_list_node *tmp;
 
+start_over:
        if (udev_list_is_empty(&event_list)) {
                if (childs > 0) {
                        err(udev, "event list empty, but childs count is %i", childs);
@@ -432,6 +435,13 @@ static void event_queue_manager(struct udev *udev)
 
                event_fork(loop_event);
                dbg(udev, "moved seq %llu to running list\n", udev_device_get_seqnum(loop_event->dev));
+
+               /* retry if events finished in the meantime */
+               if (sigchilds_waiting) {
+                       sigchilds_waiting = 0;
+                       reap_sigchilds();
+                       goto start_over;
+               }
        }
 }
 
@@ -853,9 +863,10 @@ int main(int argc, char *argv[])
 
        while (!udev_exit) {
                sigset_t blocked_mask, orig_mask;
+               struct pollfd pfd[4];
                struct pollfd *ctrl_poll, *monitor_poll, *inotify_poll = NULL;
-               struct pollfd pfd[10];
-               int fdcount, nfds = 0;
+               int nfds = 0;
+               int fdcount;
 
                sigfillset(&blocked_mask);
                sigprocmask(SIG_SETMASK, &blocked_mask, &orig_mask);
@@ -864,19 +875,22 @@ int main(int argc, char *argv[])
                        goto handle_signals;
                }
 
-#define POLL_FOR(__desc, __pollptr) do { \
-       pfd[nfds].fd = (__desc); pfd[nfds].events = POLLIN; \
-       __pollptr = &pfd[nfds++]; \
-} while (0)
-               POLL_FOR(udev_ctrl_get_fd(udev_ctrl), ctrl_poll);
-               POLL_FOR(udev_monitor_get_fd(kernel_monitor), monitor_poll);
-               if (inotify_fd >= 0)
-                       POLL_FOR(inotify_fd, inotify_poll);
-#undef POLL_FOR
+               ctrl_poll = &pfd[nfds++];
+               ctrl_poll->fd = udev_ctrl_get_fd(udev_ctrl);
+               ctrl_poll->events = POLLIN;
+
+               monitor_poll = &pfd[nfds++];
+               monitor_poll->fd = udev_monitor_get_fd(kernel_monitor);
+               monitor_poll->events = POLLIN;
+
+               if (inotify_fd >= 0) {
+                       inotify_poll = &pfd[nfds++];
+                       inotify_poll->fd = inotify_fd;
+                       inotify_poll->events = POLLIN;
+               }
 
                fdcount = ppoll(pfd, nfds, NULL, &orig_mask);
                sigprocmask(SIG_SETMASK, &orig_mask, NULL);
-
                if (fdcount < 0) {
                        if (errno == EINTR)
                                goto handle_signals;