udev: use usec_t and now()
This commit is contained in:
parent
1707b36c6d
commit
40fe8b11be
1
TODO
1
TODO
|
@ -359,7 +359,6 @@ Features:
|
||||||
* udev systemd unify:
|
* udev systemd unify:
|
||||||
- strpcpy(), strpcpyl(), strscpy(), strscpyl()
|
- strpcpy(), strpcpyl(), strscpy(), strscpyl()
|
||||||
- utf8 validator code
|
- utf8 validator code
|
||||||
- now() vs. now_usec()
|
|
||||||
|
|
||||||
* udev: scsi_id -> sg3_utils -> kill scsi_id
|
* udev: scsi_id -> sg3_utils -> kill scsi_id
|
||||||
|
|
||||||
|
|
|
@ -147,7 +147,7 @@ int udev_device_update_db(struct udev_device *udev_device)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (udev_device_get_usec_initialized(udev_device) > 0)
|
if (udev_device_get_usec_initialized(udev_device) > 0)
|
||||||
fprintf(f, "I:%llu\n", udev_device_get_usec_initialized(udev_device));
|
fprintf(f, "I:%llu\n", (unsigned long long)udev_device_get_usec_initialized(udev_device));
|
||||||
|
|
||||||
udev_list_entry_foreach(list_entry, udev_device_get_properties_list_entry(udev_device)) {
|
udev_list_entry_foreach(list_entry, udev_device_get_properties_list_entry(udev_device)) {
|
||||||
if (!udev_list_entry_get_num(list_entry))
|
if (!udev_list_entry_get_num(list_entry))
|
||||||
|
|
|
@ -67,7 +67,7 @@ struct udev_device {
|
||||||
struct udev_list sysattr_list;
|
struct udev_list sysattr_list;
|
||||||
struct udev_list tags_list;
|
struct udev_list tags_list;
|
||||||
unsigned long long int seqnum;
|
unsigned long long int seqnum;
|
||||||
unsigned long long int usec_initialized;
|
usec_t usec_initialized;
|
||||||
int devlink_priority;
|
int devlink_priority;
|
||||||
int refcount;
|
int refcount;
|
||||||
dev_t devnum;
|
dev_t devnum;
|
||||||
|
@ -246,7 +246,7 @@ static int udev_device_set_devtype(struct udev_device *udev_device, const char *
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int udev_device_set_subsystem(struct udev_device *udev_device, const char *subsystem)
|
int udev_device_set_subsystem(struct udev_device *udev_device, const char *subsystem)
|
||||||
{
|
{
|
||||||
free(udev_device->subsystem);
|
free(udev_device->subsystem);
|
||||||
udev_device->subsystem = strdup(subsystem);
|
udev_device->subsystem = strdup(subsystem);
|
||||||
|
@ -1267,7 +1267,7 @@ _public_ const char *udev_device_get_action(struct udev_device *udev_device)
|
||||||
**/
|
**/
|
||||||
_public_ unsigned long long int udev_device_get_usec_since_initialized(struct udev_device *udev_device)
|
_public_ unsigned long long int udev_device_get_usec_since_initialized(struct udev_device *udev_device)
|
||||||
{
|
{
|
||||||
unsigned long long now_ts;
|
usec_t now_ts;
|
||||||
|
|
||||||
if (udev_device == NULL)
|
if (udev_device == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1275,23 +1275,23 @@ _public_ unsigned long long int udev_device_get_usec_since_initialized(struct ud
|
||||||
udev_device_read_db(udev_device, NULL);
|
udev_device_read_db(udev_device, NULL);
|
||||||
if (udev_device->usec_initialized == 0)
|
if (udev_device->usec_initialized == 0)
|
||||||
return 0;
|
return 0;
|
||||||
now_ts = now_usec();
|
now_ts = now(CLOCK_MONOTONIC);
|
||||||
if (now_ts == 0)
|
if (now_ts == 0)
|
||||||
return 0;
|
return 0;
|
||||||
return now_ts - udev_device->usec_initialized;
|
return now_ts - udev_device->usec_initialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long long udev_device_get_usec_initialized(struct udev_device *udev_device)
|
usec_t udev_device_get_usec_initialized(struct udev_device *udev_device)
|
||||||
{
|
{
|
||||||
return udev_device->usec_initialized;
|
return udev_device->usec_initialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
void udev_device_set_usec_initialized(struct udev_device *udev_device, unsigned long long usec_initialized)
|
void udev_device_set_usec_initialized(struct udev_device *udev_device, usec_t usec_initialized)
|
||||||
{
|
{
|
||||||
char num[32];
|
char num[32];
|
||||||
|
|
||||||
udev_device->usec_initialized = usec_initialized;
|
udev_device->usec_initialized = usec_initialized;
|
||||||
snprintf(num, sizeof(num), "%llu", usec_initialized);
|
snprintf(num, sizeof(num), "%llu", (unsigned long long)usec_initialized);
|
||||||
udev_device_add_property(udev_device, "USEC_INITIALIZED", num);
|
udev_device_add_property(udev_device, "USEC_INITIALIZED", num);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -356,7 +356,7 @@ bool udev_hwdb_validate(struct udev_hwdb *hwdb) {
|
||||||
return false;
|
return false;
|
||||||
if (fstat(fileno(hwdb->f), &st) < 0)
|
if (fstat(fileno(hwdb->f), &st) < 0)
|
||||||
return true;
|
return true;
|
||||||
if (ts_usec(&hwdb->st.st_mtim) != ts_usec(&st.st_mtim))
|
if (timespec_load(&hwdb->st.st_mtim) != timespec_load(&st.st_mtim))
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,13 +41,14 @@ void udev_log(struct udev *udev,
|
||||||
int priority, const char *file, int line, const char *fn,
|
int priority, const char *file, int line, const char *fn,
|
||||||
const char *format, ...)
|
const char *format, ...)
|
||||||
__attribute__((format(printf, 6, 7)));
|
__attribute__((format(printf, 6, 7)));
|
||||||
int udev_get_rules_path(struct udev *udev, char **path[], unsigned long long *ts_usec[]);
|
int udev_get_rules_path(struct udev *udev, char **path[], usec_t *ts_usec[]);
|
||||||
struct udev_list_entry *udev_add_property(struct udev *udev, const char *key, const char *value);
|
struct udev_list_entry *udev_add_property(struct udev *udev, const char *key, const char *value);
|
||||||
struct udev_list_entry *udev_get_properties_list_entry(struct udev *udev);
|
struct udev_list_entry *udev_get_properties_list_entry(struct udev *udev);
|
||||||
|
|
||||||
/* libudev-device.c */
|
/* libudev-device.c */
|
||||||
struct udev_device *udev_device_new(struct udev *udev);
|
struct udev_device *udev_device_new(struct udev *udev);
|
||||||
mode_t udev_device_get_devnode_mode(struct udev_device *udev_device);
|
mode_t udev_device_get_devnode_mode(struct udev_device *udev_device);
|
||||||
|
int udev_device_set_subsystem(struct udev_device *udev_device, const char *subsystem);
|
||||||
int udev_device_set_syspath(struct udev_device *udev_device, const char *syspath);
|
int udev_device_set_syspath(struct udev_device *udev_device, const char *syspath);
|
||||||
int udev_device_set_devnode(struct udev_device *udev_device, const char *devnode);
|
int udev_device_set_devnode(struct udev_device *udev_device, const char *devnode);
|
||||||
int udev_device_add_devlink(struct udev_device *udev_device, const char *devlink);
|
int udev_device_add_devlink(struct udev_device *udev_device, const char *devlink);
|
||||||
|
@ -65,8 +66,8 @@ const char *udev_device_get_id_filename(struct udev_device *udev_device);
|
||||||
void udev_device_set_is_initialized(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);
|
int udev_device_add_tag(struct udev_device *udev_device, const char *tag);
|
||||||
void udev_device_cleanup_tags_list(struct udev_device *udev_device);
|
void udev_device_cleanup_tags_list(struct udev_device *udev_device);
|
||||||
unsigned long long udev_device_get_usec_initialized(struct udev_device *udev_device);
|
usec_t 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);
|
void udev_device_set_usec_initialized(struct udev_device *udev_device, usec_t usec_initialized);
|
||||||
int udev_device_get_devlink_priority(struct udev_device *udev_device);
|
int udev_device_get_devlink_priority(struct udev_device *udev_device);
|
||||||
int udev_device_set_devlink_priority(struct udev_device *udev_device, int prio);
|
int udev_device_set_devlink_priority(struct udev_device *udev_device, int prio);
|
||||||
int udev_device_get_watch_handle(struct udev_device *udev_device);
|
int udev_device_get_watch_handle(struct udev_device *udev_device);
|
||||||
|
@ -167,7 +168,5 @@ int util_delete_path(struct udev *udev, const char *path);
|
||||||
uid_t util_lookup_user(struct udev *udev, const char *user);
|
uid_t util_lookup_user(struct udev *udev, const char *user);
|
||||||
gid_t util_lookup_group(struct udev *udev, const char *group);
|
gid_t util_lookup_group(struct udev *udev, const char *group);
|
||||||
int util_resolve_subsys_kernel(struct udev *udev, const char *string, char *result, size_t maxsize, int read_value);
|
int util_resolve_subsys_kernel(struct udev *udev, const char *string, char *result, size_t maxsize, int read_value);
|
||||||
unsigned long long ts_usec(const struct timespec *ts);
|
|
||||||
unsigned long long now_usec(void);
|
|
||||||
ssize_t print_kmsg(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
|
ssize_t print_kmsg(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -691,23 +691,6 @@ uint64_t util_string_bloom64(const char *str)
|
||||||
return bits;
|
return bits;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define USEC_PER_SEC 1000000ULL
|
|
||||||
#define NSEC_PER_USEC 1000ULL
|
|
||||||
unsigned long long ts_usec(const struct timespec *ts)
|
|
||||||
{
|
|
||||||
return (unsigned long long) ts->tv_sec * USEC_PER_SEC +
|
|
||||||
(unsigned long long) ts->tv_nsec / NSEC_PER_USEC;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long long now_usec(void)
|
|
||||||
{
|
|
||||||
struct timespec ts;
|
|
||||||
|
|
||||||
if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0)
|
|
||||||
return 0;
|
|
||||||
return ts_usec(&ts);
|
|
||||||
}
|
|
||||||
|
|
||||||
ssize_t print_kmsg(const char *fmt, ...)
|
ssize_t print_kmsg(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
|
|
@ -48,7 +48,7 @@ struct udev_event *udev_event_new(struct udev_device *dev)
|
||||||
event->udev = udev;
|
event->udev = udev;
|
||||||
udev_list_init(udev, &event->run_list, false);
|
udev_list_init(udev, &event->run_list, false);
|
||||||
event->fd_signal = -1;
|
event->fd_signal = -1;
|
||||||
event->birth_usec = now_usec();
|
event->birth_usec = now(CLOCK_MONOTONIC);
|
||||||
event->timeout_usec = 30 * 1000 * 1000;
|
event->timeout_usec = 30 * 1000 * 1000;
|
||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
@ -466,9 +466,9 @@ static void spawn_read(struct udev_event *event,
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (event->timeout_usec > 0) {
|
if (event->timeout_usec > 0) {
|
||||||
unsigned long long age_usec;
|
usec_t age_usec;
|
||||||
|
|
||||||
age_usec = now_usec() - event->birth_usec;
|
age_usec = now(CLOCK_MONOTONIC) - event->birth_usec;
|
||||||
if (age_usec >= event->timeout_usec) {
|
if (age_usec >= event->timeout_usec) {
|
||||||
log_error("timeout '%s'\n", cmd);
|
log_error("timeout '%s'\n", cmd);
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -554,9 +554,9 @@ static int spawn_wait(struct udev_event *event, const char *cmd, pid_t pid)
|
||||||
int fdcount;
|
int fdcount;
|
||||||
|
|
||||||
if (event->timeout_usec > 0) {
|
if (event->timeout_usec > 0) {
|
||||||
unsigned long long age_usec;
|
usec_t age_usec;
|
||||||
|
|
||||||
age_usec = now_usec() - event->birth_usec;
|
age_usec = now(CLOCK_MONOTONIC) - event->birth_usec;
|
||||||
if (age_usec >= event->timeout_usec)
|
if (age_usec >= event->timeout_usec)
|
||||||
timeout = 1000;
|
timeout = 1000;
|
||||||
else
|
else
|
||||||
|
@ -860,7 +860,7 @@ int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules,
|
||||||
if (event->dev_db != NULL && udev_device_get_usec_initialized(event->dev_db) > 0)
|
if (event->dev_db != NULL && udev_device_get_usec_initialized(event->dev_db) > 0)
|
||||||
udev_device_set_usec_initialized(event->dev, udev_device_get_usec_initialized(event->dev_db));
|
udev_device_set_usec_initialized(event->dev, udev_device_get_usec_initialized(event->dev_db));
|
||||||
else if (udev_device_get_usec_initialized(event->dev) == 0)
|
else if (udev_device_get_usec_initialized(event->dev) == 0)
|
||||||
udev_device_set_usec_initialized(event->dev, now_usec());
|
udev_device_set_usec_initialized(event->dev, now(CLOCK_MONOTONIC));
|
||||||
|
|
||||||
/* (re)write database file */
|
/* (re)write database file */
|
||||||
udev_device_update_db(dev);
|
udev_device_update_db(dev);
|
||||||
|
|
|
@ -47,7 +47,7 @@ struct uid_gid {
|
||||||
struct udev_rules {
|
struct udev_rules {
|
||||||
struct udev *udev;
|
struct udev *udev;
|
||||||
char **dirs;
|
char **dirs;
|
||||||
unsigned long long *dirs_ts_usec;
|
usec_t *dirs_ts_usec;
|
||||||
int resolve_names;
|
int resolve_names;
|
||||||
|
|
||||||
/* every key in the rules file becomes a token */
|
/* every key in the rules file becomes a token */
|
||||||
|
@ -1691,7 +1691,7 @@ bool udev_rules_check_timestamp(struct udev_rules *rules)
|
||||||
if (stat(rules->dirs[i], &stats) < 0)
|
if (stat(rules->dirs[i], &stats) < 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (rules->dirs_ts_usec[i] == ts_usec(&stats.st_mtim))
|
if (rules->dirs_ts_usec[i] == timespec_load(&stats.st_mtim))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* first check */
|
/* first check */
|
||||||
|
@ -1701,7 +1701,7 @@ bool udev_rules_check_timestamp(struct udev_rules *rules)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* update timestamp */
|
/* update timestamp */
|
||||||
rules->dirs_ts_usec[i] = ts_usec(&stats.st_mtim);
|
rules->dirs_ts_usec[i] = timespec_load(&stats.st_mtim);
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
return changed;
|
return changed;
|
||||||
|
|
|
@ -41,8 +41,8 @@ struct udev_event {
|
||||||
gid_t gid;
|
gid_t gid;
|
||||||
struct udev_list run_list;
|
struct udev_list run_list;
|
||||||
int exec_delay;
|
int exec_delay;
|
||||||
unsigned long long birth_usec;
|
usec_t birth_usec;
|
||||||
unsigned long long timeout_usec;
|
usec_t timeout_usec;
|
||||||
int fd_signal;
|
int fd_signal;
|
||||||
unsigned int builtin_run;
|
unsigned int builtin_run;
|
||||||
unsigned int builtin_ret;
|
unsigned int builtin_ret;
|
||||||
|
|
|
@ -47,9 +47,9 @@ static int adm_settle(struct udev *udev, int argc, char *argv[])
|
||||||
{ "help", no_argument, NULL, 'h' },
|
{ "help", no_argument, NULL, 'h' },
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
unsigned long long start_usec = now_usec();
|
usec_t start_usec = now(CLOCK_MONOTONIC);
|
||||||
unsigned long long start = 0;
|
usec_t start = 0;
|
||||||
unsigned long long end = 0;
|
usec_t end = 0;
|
||||||
int quiet = 0;
|
int quiet = 0;
|
||||||
const char *exists = NULL;
|
const char *exists = NULL;
|
||||||
unsigned int timeout = 120;
|
unsigned int timeout = 120;
|
||||||
|
@ -123,7 +123,7 @@ static int adm_settle(struct udev *udev, int argc, char *argv[])
|
||||||
start = 0;
|
start = 0;
|
||||||
end = 0;
|
end = 0;
|
||||||
}
|
}
|
||||||
log_debug("start=%llu end=%llu current=%llu\n", start, end, kernel_seq);
|
log_debug("start=%llu end=%llu current=%llu\n", (unsigned long long)start, (unsigned long long)end, kernel_seq);
|
||||||
} else {
|
} else {
|
||||||
if (end > 0) {
|
if (end > 0) {
|
||||||
log_error("seq-end needs seq-start parameter, ignoring\n");
|
log_error("seq-end needs seq-start parameter, ignoring\n");
|
||||||
|
@ -199,9 +199,9 @@ static int adm_settle(struct udev *udev, int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
if (timeout > 0) {
|
if (timeout > 0) {
|
||||||
unsigned long long age_usec;
|
usec_t age_usec;
|
||||||
|
|
||||||
age_usec = now_usec() - start_usec;
|
age_usec = now(CLOCK_MONOTONIC) - start_usec;
|
||||||
if (age_usec / (1000 * 1000) >= timeout) {
|
if (age_usec / (1000 * 1000) >= timeout) {
|
||||||
struct udev_list_entry *list_entry;
|
struct udev_list_entry *list_entry;
|
||||||
|
|
||||||
|
|
|
@ -122,7 +122,7 @@ struct worker {
|
||||||
struct udev_monitor *monitor;
|
struct udev_monitor *monitor;
|
||||||
enum worker_state state;
|
enum worker_state state;
|
||||||
struct event *event;
|
struct event *event;
|
||||||
unsigned long long event_start_usec;
|
usec_t event_start_usec;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* passed from worker to main process */
|
/* passed from worker to main process */
|
||||||
|
@ -378,7 +378,7 @@ out:
|
||||||
worker->monitor = worker_monitor;
|
worker->monitor = worker_monitor;
|
||||||
worker->pid = pid;
|
worker->pid = pid;
|
||||||
worker->state = WORKER_RUNNING;
|
worker->state = WORKER_RUNNING;
|
||||||
worker->event_start_usec = now_usec();
|
worker->event_start_usec = now(CLOCK_MONOTONIC);
|
||||||
worker->event = event;
|
worker->event = event;
|
||||||
event->state = EVENT_RUNNING;
|
event->state = EVENT_RUNNING;
|
||||||
udev_list_node_append(&worker->node, &worker_list);
|
udev_list_node_append(&worker->node, &worker_list);
|
||||||
|
@ -409,7 +409,7 @@ static void event_run(struct event *event)
|
||||||
worker_ref(worker);
|
worker_ref(worker);
|
||||||
worker->event = event;
|
worker->event = event;
|
||||||
worker->state = WORKER_RUNNING;
|
worker->state = WORKER_RUNNING;
|
||||||
worker->event_start_usec = now_usec();
|
worker->event_start_usec = now(CLOCK_MONOTONIC);
|
||||||
event->state = EVENT_RUNNING;
|
event->state = EVENT_RUNNING;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1374,7 +1374,7 @@ int main(int argc, char *argv[])
|
||||||
udev_list_node_init(&worker_list);
|
udev_list_node_init(&worker_list);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
static unsigned long long last_usec;
|
static usec_t last_usec;
|
||||||
struct epoll_event ev[8];
|
struct epoll_event ev[8];
|
||||||
int fdcount;
|
int fdcount;
|
||||||
int timeout;
|
int timeout;
|
||||||
|
@ -1445,7 +1445,7 @@ int main(int argc, char *argv[])
|
||||||
if (worker->state != WORKER_RUNNING)
|
if (worker->state != WORKER_RUNNING)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ((now_usec() - worker->event_start_usec) > 30 * 1000 * 1000) {
|
if ((now(CLOCK_MONOTONIC) - worker->event_start_usec) > 30 * 1000 * 1000) {
|
||||||
log_error("worker [%u] %s timeout; kill it\n", worker->pid,
|
log_error("worker [%u] %s timeout; kill it\n", worker->pid,
|
||||||
worker->event ? worker->event->devpath : "<idle>");
|
worker->event ? worker->event->devpath : "<idle>");
|
||||||
kill(worker->pid, SIGKILL);
|
kill(worker->pid, SIGKILL);
|
||||||
|
@ -1479,13 +1479,13 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check for changed config, every 3 seconds at most */
|
/* check for changed config, every 3 seconds at most */
|
||||||
if ((now_usec() - last_usec) > 3 * 1000 * 1000) {
|
if ((now(CLOCK_MONOTONIC) - last_usec) > 3 * 1000 * 1000) {
|
||||||
if (udev_rules_check_timestamp(rules))
|
if (udev_rules_check_timestamp(rules))
|
||||||
reload = true;
|
reload = true;
|
||||||
if (udev_builtin_validate(udev))
|
if (udev_builtin_validate(udev))
|
||||||
reload = true;
|
reload = true;
|
||||||
|
|
||||||
last_usec = now_usec();
|
last_usec = now(CLOCK_MONOTONIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* reload requested, HUP signal received, rules changed, builtin changed */
|
/* reload requested, HUP signal received, rules changed, builtin changed */
|
||||||
|
@ -1505,7 +1505,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
dev = udev_monitor_receive_device(monitor);
|
dev = udev_monitor_receive_device(monitor);
|
||||||
if (dev != NULL) {
|
if (dev != NULL) {
|
||||||
udev_device_set_usec_initialized(dev, now_usec());
|
udev_device_set_usec_initialized(dev, now(CLOCK_MONOTONIC));
|
||||||
if (event_queue_insert(dev) < 0)
|
if (event_queue_insert(dev) < 0)
|
||||||
udev_device_unref(dev);
|
udev_device_unref(dev);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue