chiark / gitweb /
udevadm: settle - synchronise with the udev daemon
[elogind.git] / udev / udevd.c
index ee3d6f50338600db3608ce4d49a8408bc62b3c19..291655ef000132c677138109140d729892045343 100644 (file)
@@ -1,6 +1,8 @@
 /*
  * Copyright (C) 2004-2008 Kay Sievers <kay.sievers@vrfy.org>
  * Copyright (C) 2004 Chris Friesen <chris_friesen@sympatico.ca>
+ * Copyright (C) 2009 Canonical Ltd.
+ * Copyright (C) 2009 Scott James Remnant <scott@netsplit.com>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -69,6 +71,7 @@ static volatile int sigchilds_waiting;
 static volatile int udev_exit;
 static volatile int reload_config;
 static volatile int signal_received;
+static volatile pid_t settle_pid;
 static int run_exec_q;
 static int stop_exec_q;
 static int max_childs;
@@ -513,6 +516,11 @@ static void handle_ctrl_msg(struct udev_ctrl *uctrl)
                info(udev, "udevd message (SET_MAX_CHILDS) received, max_childs=%i\n", i);
                max_childs = i;
        }
+
+       settle_pid = udev_ctrl_get_settle(ctrl_msg);
+       if (settle_pid > 0) {
+               info(udev, "udevd message (SETTLE) received\n");
+       }
        udev_ctrl_msg_unref(ctrl_msg);
 }
 
@@ -1023,6 +1031,11 @@ handle_signals:
                        if (!stop_exec_q)
                                event_queue_manager(udev);
                }
+
+               if (settle_pid > 0) {
+                       kill(settle_pid, SIGUSR1);
+                       settle_pid = 0;
+               }
        }
        cleanup_queue_dir(udev);
        rc = 0;