From 86617453cd78bf88d347f0e75a5be8b5ebac6c2e Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Thu, 15 Mar 2012 02:12:43 +0100 Subject: [PATCH] reinstate TIMEOUT= handling This reverts 43d5c5f03645c4b842659f9b5bd0ae465e885e92 and 57c6f8ae5f52a6e8ffc66a54966346f733dded39. Signed-off-by: Tom Gundersen --- src/libudev-device.c | 19 +++++++++++++++++++ src/libudev-private.h | 1 + src/udevd.c | 13 ++++++++++--- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/libudev-device.c b/src/libudev-device.c index 10f28b8..639c367 100644 --- a/src/libudev-device.c +++ b/src/libudev-device.c @@ -68,6 +68,7 @@ struct udev_device { struct udev_list tags_list; unsigned long long int seqnum; unsigned long long int usec_initialized; + int timeout; int devlink_priority; int refcount; dev_t devnum; @@ -160,6 +161,21 @@ static int udev_device_set_devnum(struct udev_device *udev_device, dev_t devnum) return 0; } +int udev_device_get_timeout(struct udev_device *udev_device) +{ + return udev_device->timeout; +} + +static int udev_device_set_timeout(struct udev_device *udev_device, int timeout) +{ + char num[32]; + + udev_device->timeout = timeout; + snprintf(num, sizeof(num), "%u", timeout); + udev_device_add_property(udev_device, "TIMEOUT", num); + return 0; +} + const char *udev_device_get_devpath_old(struct udev_device *udev_device) { return udev_device->devpath_old; @@ -414,6 +430,8 @@ void udev_device_add_property_from_string_parse(struct udev_device *udev_device, udev_device_set_devpath_old(udev_device, &property[12]); } else if (strncmp(property, "SEQNUM=", 7) == 0) { udev_device_set_seqnum(udev_device, strtoull(&property[7], NULL, 10)); + } else if (strncmp(property, "TIMEOUT=", 8) == 0) { + udev_device_set_timeout(udev_device, strtoull(&property[8], NULL, 10)); } else if (strncmp(property, "IFINDEX=", 8) == 0) { udev_device_set_ifindex(udev_device, strtoull(&property[8], NULL, 10)); } else if (strncmp(property, "DEVMODE=", 8) == 0) { @@ -599,6 +617,7 @@ struct udev_device *udev_device_new(struct udev *udev) udev_list_init(udev, &udev_device->sysattr_value_list, true); udev_list_init(udev, &udev_device->sysattr_list, false); udev_list_init(udev, &udev_device->tags_list, true); + udev_device->timeout = -1; udev_device->watch_handle = -1; /* copy global properties */ udev_list_entry_foreach(list_entry, udev_get_properties_list_entry(udev)) diff --git a/src/libudev-private.h b/src/libudev-private.h index 5f5c64a..ec63b67 100644 --- a/src/libudev-private.h +++ b/src/libudev-private.h @@ -87,6 +87,7 @@ const char *udev_device_get_id_filename(struct udev_device *udev_device); void udev_device_set_is_initialized(struct udev_device *udev_device); int udev_device_add_tag(struct udev_device *udev_device, const char *tag); void udev_device_cleanup_tags_list(struct udev_device *udev_device); +int udev_device_get_timeout(struct udev_device *udev_device); unsigned long long udev_device_get_usec_initialized(struct udev_device *udev_device); void udev_device_set_usec_initialized(struct udev_device *udev_device, unsigned long long usec_initialized); int udev_device_get_devlink_priority(struct udev_device *udev_device); diff --git a/src/udevd.c b/src/udevd.c index 1702217..88e9272 100644 --- a/src/udevd.c +++ b/src/udevd.c @@ -401,7 +401,7 @@ out: } } -static void event_run(struct event *event) +static void event_run(struct event *event, bool force) { struct udev_list_node *loop; @@ -427,7 +427,7 @@ static void event_run(struct event *event) return; } - if (children >= children_max) { + if (!force && children >= children_max) { if (children_max > 1) info(event->udev, "maximum number (%i) of children reached\n", children); return; @@ -461,6 +461,13 @@ static int event_queue_insert(struct udev_device *dev) event->state = EVENT_QUEUED; udev_list_node_append(&event->node, &event_list); + + /* run all events with a timeout set immediately */ + if (udev_device_get_timeout(dev) > 0) { + event_run(event, true); + return 0; + } + return 0; } @@ -577,7 +584,7 @@ static void event_queue_start(struct udev *udev) continue; } - event_run(event); + event_run(event, false); } } -- 1.7.9.4