]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udevd: introduce on_event_timeout{,_warning}
authorTom Gundersen <teg@jklm.no>
Mon, 18 May 2015 15:17:07 +0000 (17:17 +0200)
committerTom Gundersen <teg@jklm.no>
Mon, 18 May 2015 21:49:35 +0000 (23:49 +0200)
This uses kill_and_sigcont() instead of kill(), otherwise no functional change.

src/udev/udevd.c

index a9e82de4cd5d08430fd151dc178038e3ad6027d6..a641b16e8b9bb45e9d61aa7f18a80b213388f83c 100644 (file)
@@ -43,6 +43,7 @@
 #include "sd-daemon.h"
 #include "rtnl-util.h"
 #include "cgroup-util.h"
+#include "process-util.h"
 #include "dev-setup.h"
 #include "fileio.h"
 #include "selinux-util.h"
@@ -226,6 +227,30 @@ static int worker_new(struct worker **ret, Manager *manager, struct udev_monitor
         return 0;
 }
 
+static int on_event_timeout(sd_event_source *s, uint64_t usec, void *userdata) {
+        struct event *event = userdata;
+
+        assert(event);
+        assert(event->worker);
+
+        kill_and_sigcont(event->worker->pid, SIGKILL);
+        event->worker->state = WORKER_KILLED;
+
+        log_error("seq %llu '%s' killed", udev_device_get_seqnum(event->dev), event->devpath);
+
+        return 1;
+}
+
+static int on_event_timeout_warning(sd_event_source *s, uint64_t usec, void *userdata) {
+        struct event *event = userdata;
+
+        assert(event);
+
+        log_warning("seq %llu '%s' is taking a long time", udev_device_get_seqnum(event->dev), event->devpath);
+
+        return 1;
+}
+
 static void worker_attach_event(struct worker *worker, struct event *event) {
         assert(worker);
         assert(event);
@@ -1571,14 +1596,10 @@ int main(int argc, char *argv[]) {
                                 ts = now(CLOCK_MONOTONIC);
 
                                 if ((ts - event->start_usec) > arg_event_timeout_warn_usec) {
-                                        if ((ts - event->start_usec) > arg_event_timeout_usec) {
-                                                log_error("worker ["PID_FMT"] %s timeout; kill it", worker->pid, event->devpath);
-                                                kill(worker->pid, SIGKILL);
-                                                worker->state = WORKER_KILLED;
-
-                                                log_error("seq %llu '%s' killed", udev_device_get_seqnum(event->dev), event->devpath);
-                                        } else if (!event->warned) {
-                                                log_warning("worker ["PID_FMT"] %s is taking a long time", worker->pid, event->devpath);
+                                        if ((ts - event->start_usec) > arg_event_timeout_usec)
+                                                on_event_timeout(NULL, 0, event);
+                                        else if (!event->warned) {
+                                                on_event_timeout_warning(NULL, 0, event);
                                                 event->warned = true;
                                         }
                                 }