static int udevsendsock;
static int pipefds[2];
+static long startup_time;
static unsigned long long expected_seqnum = 0;
static volatile int sigchilds_waiting;
static volatile int run_msg_q;
struct hotplug_msg *tmp_msg;
struct sysinfo info;
long msg_age = 0;
+ static int timeout = EVENT_INIT_TIMEOUT_SEC;
+ static int init = 1;
dbg("msg queue manager, next expected is %llu", expected_seqnum);
recheck:
continue;
}
+ /* see if we are in the initialization phase and wait for the very first events */
+ if (init && (info.uptime - startup_time >= INIT_TIME_SEC)) {
+ init = 0;
+ timeout = EVENT_TIMEOUT_SEC;
+ dbg("initialization phase passed, set timeout to %i seconds", EVENT_TIMEOUT_SEC);
+ }
+
/* move event with expired timeout to the exec list */
sysinfo(&info);
msg_age = info.uptime - loop_msg->queue_time;
dbg("seq %llu is %li seconds old", loop_msg->seqnum, msg_age);
- if (msg_age > EVENT_TIMEOUT_SEC-1) {
+ if (msg_age >= timeout) {
msg_move_exec(loop_msg);
goto recheck;
} else {
/* set timeout for remaining queued events */
if (list_empty(&msg_list) == 0) {
- struct itimerval itv = {{0, 0}, {EVENT_TIMEOUT_SEC - msg_age, 0}};
- dbg("next event expires in %li seconds", EVENT_TIMEOUT_SEC - msg_age);
+ struct itimerval itv = {{0, 0}, {timeout - msg_age, 0}};
+ dbg("next event expires in %li seconds", timeout - msg_age);
setitimer(ITIMER_REAL, &itv, NULL);
}
}
int main(int argc, char *argv[], char *envp[])
{
+ struct sysinfo info;
int maxsockplus;
struct sockaddr_un saddr;
socklen_t addrlen;
else
udev_bin = UDEV_BIN;
+ /* handle special startup timeout*/
+ sysinfo(&info);
+ startup_time = info.uptime;
+
FD_ZERO(&readfds);
FD_SET(udevsendsock, &readfds);
FD_SET(pipefds[0], &readfds);
#include "list.h"
#define UDEV_MAGIC "udevd_" UDEV_VERSION
-#define EVENT_TIMEOUT_SEC 10
#define UDEVD_SOCK_PATH "udevd"
#define SEND_WAIT_MAX_SECONDS 3
#define SEND_WAIT_LOOP_PER_SECOND 10
+#define INIT_TIME_SEC 5
+#define EVENT_INIT_TIMEOUT_SEC 2
+#define EVENT_TIMEOUT_SEC 10
/* environment buffer, should match the kernel's size in lib/kobject_uevent.h */
#define HOTPLUG_BUFFER_SIZE 1024