Lines Matching refs:event

44 #include "sd-event.h"
79 sd_event *event;
110 struct event {
130 static inline struct event *node_to_event(struct udev_list_node *node) {
131 return container_of(node, struct event, node);
150 struct event *event;
157 static void event_free(struct event *event) {
160 if (!event)
163 udev_list_node_remove(&event->node);
164 udev_device_unref(event->dev);
165 udev_device_unref(event->dev_kernel);
167 sd_event_source_unref(event->timeout_warning);
168 sd_event_source_unref(event->timeout);
170 if (event->worker)
171 event->worker->event = NULL;
173 assert(event->manager);
175 if (udev_list_node_is_empty(&event->manager->events)) {
177 if (event->manager->pid == getpid()) {
184 free(event);
195 event_free(worker->event);
247 struct event *event = userdata;
249 assert(event);
250 assert(event->worker);
252 kill_and_sigcont(event->worker->pid, SIGKILL);
253 event->worker->state = WORKER_KILLED;
255 log_error("seq %llu '%s' killed", udev_device_get_seqnum(event->dev), event->devpath);
261 struct event *event = userdata;
263 assert(event);
265 log_warning("seq %llu '%s' is taking a long time", udev_device_get_seqnum(event->dev), event->devpath);
270 static void worker_attach_event(struct worker *worker, struct event *event) {
276 assert(event);
277 assert(!event->worker);
278 assert(!worker->event);
281 worker->event = event;
282 event->state = EVENT_RUNNING;
283 event->worker = worker;
285 e = worker->manager->event;
289 (void) sd_event_add_time(e, &event->timeout_warning, clock_boottime_or_monotonic(),
290 usec + arg_event_timeout_warn_usec, USEC_PER_SEC, on_event_timeout_warning, event);
292 (void) sd_event_add_time(e, &event->timeout, clock_boottime_or_monotonic(),
293 usec + arg_event_timeout_usec, USEC_PER_SEC, on_event_timeout, event);
307 sd_event_unref(manager->event);
332 static void worker_spawn(Manager *manager, struct event *event) {
333 struct udev *udev = event->udev;
360 dev = event->dev;
361 event->dev = NULL;
378 manager->event = sd_event_unref(manager->event);
429 * cause udev to skip the event handling; in the case udev
431 * udev has finished its event handling.
445 log_debug_errno(errno, "Unable to flock(%s), skipping event handling: %m", udev_device_get_devnode(d));
476 /* send processed event back to libudev listeners */
482 /* send udevd the result of the event execution */
533 event->state = EVENT_QUEUED;
544 worker_attach_event(worker, event);
546 log_debug("seq %llu forked new worker ["PID_FMT"]", udev_device_get_seqnum(event->dev), pid);
552 static void event_run(Manager *manager, struct event *event) {
557 assert(event);
565 count = udev_monitor_send_device(manager->monitor, worker->monitor, event->dev);
573 worker_attach_event(worker, event);
584 worker_spawn(manager, event);
588 struct event *event;
600 event = new0(struct event, 1);
601 if (!event)
604 event->udev = udev_device_get_udev(dev);
605 event->manager = manager;
606 event->dev = dev;
607 event->dev_kernel = udev_device_shallow_clone(dev);
608 udev_device_copy_properties(event->dev_kernel, dev);
609 event->seqnum = udev_device_get_seqnum(dev);
610 event->devpath = udev_device_get_devpath(dev);
611 event->devpath_len = strlen(event->devpath);
612 event->devpath_old = udev_device_get_devpath_old(dev);
613 event->devnum = udev_device_get_devnum(dev);
614 event->is_block = streq("block", udev_device_get_subsystem(dev));
615 event->ifindex = udev_device_get_ifindex(dev);
620 event->state = EVENT_QUEUED;
628 udev_list_node_append(&event->node, &manager->events);
648 /* lookup event for identical, parent, child device */
649 static bool is_devpath_busy(Manager *manager, struct event *event) {
655 struct event *loop_event = node_to_event(loop);
657 /* we already found a later event, earlier can not block us, no need to check again */
658 if (loop_event->seqnum < event->delaying_seqnum)
661 /* event we checked earlier still exists, no need to check again */
662 if (loop_event->seqnum == event->delaying_seqnum)
665 /* found ourself, no later event can block us */
666 if (loop_event->seqnum >= event->seqnum)
670 if (major(event->devnum) != 0 && event->devnum == loop_event->devnum && event->is_block == loop_event->is_block)
674 if (event->ifindex != 0 && event->ifindex == loop_event->ifindex)
678 if (event->devpath_old != NULL && streq(loop_event->devpath, event->devpath_old)) {
679 event->delaying_seqnum = loop_event->seqnum;
684 common = MIN(loop_event->devpath_len, event->devpath_len);
687 if (memcmp(loop_event->devpath, event->devpath, common) != 0)
690 /* identical device event found */
691 if (loop_event->devpath_len == event->devpath_len) {
693 if (major(event->devnum) != 0 && (event->devnum != loop_event->devnum || event->is_block != loop_event->is_block))
695 if (event->ifindex != 0 && event->ifindex != loop_event->ifindex)
697 event->delaying_seqnum = loop_event->seqnum;
701 /* parent device event found */
702 if (event->devpath[common] == '/') {
703 event->delaying_seqnum = loop_event->seqnum;
707 /* child device event found */
709 event->delaying_seqnum = loop_event->seqnum;
727 sd_event_exit(manager->event, -ETIMEDOUT);
758 assert_se(sd_event_now(manager->event, clock_boottime_or_monotonic(), &usec) >= 0);
760 r = sd_event_add_time(manager->event, NULL, clock_boottime_or_monotonic(),
794 assert_se(sd_event_now(manager->event, clock_boottime_or_monotonic(), &usec) >= 0);
814 struct event *event = node_to_event(loop);
816 if (event->state != EVENT_QUEUED)
819 /* do not start event if parent or child event is still running */
820 if (is_devpath_busy(manager, event))
823 event_run(manager, event);
831 struct event *event = node_to_event(loop);
833 if (match_type != EVENT_UNDEF && match_type != event->state)
836 event_free(event);
903 event_free(worker->event);
1036 * partition table is found, and we will not get an event for
1083 * out a "change" event for the disk, and "remove/add" for all
1146 log_debug("inotify event: %x for %s", e->mask, udev_device_get_devnode(dev));
1151 * state. If we just handled an inotify event, we might have
1152 * generated a "change" event, but we won't have queued up
1220 if (worker->event) {
1221 log_error("worker ["PID_FMT"] failed while handling '%s'", pid, worker->event->devpath);
1223 udev_device_delete_db(worker->event->dev);
1224 udev_device_tag_index(worker->event->dev, NULL, false);
1225 /* forward kernel event without amending it */
1226 udev_monitor_send_device(manager->monitor, NULL, worker->event->dev_kernel);
1254 r = sd_event_exit(manager->event, 0);
1359 * udev.event-timeout=<number of seconds> seconds to wait before terminating an event
1393 } else if (streq(key, "event-timeout")) {
1416 " --event-timeout=SECONDS Seconds to wait before terminating an event\n"
1428 { "event-timeout", required_argument, NULL, 't' },
1461 log_warning("Invalid --event-timeout ignored: %s", optarg);
1558 r = sd_event_default(&manager->event);
1560 return log_error_errno(r, "could not allocate event loop: %m");
1562 r = sd_event_add_signal(manager->event, NULL, SIGINT, on_sigterm, manager);
1564 return log_error_errno(r, "error creating sigint event source: %m");
1566 r = sd_event_add_signal(manager->event, NULL, SIGTERM, on_sigterm, manager);
1568 return log_error_errno(r, "error creating sigterm event source: %m");
1570 r = sd_event_add_signal(manager->event, NULL, SIGHUP, on_sighup, manager);
1572 return log_error_errno(r, "error creating sighup event source: %m");
1574 r = sd_event_add_signal(manager->event, NULL, SIGCHLD, on_sigchld, manager);
1576 return log_error_errno(r, "error creating sigchld event source: %m");
1578 r = sd_event_set_watchdog(manager->event, true);
1580 return log_error_errno(r, "error creating watchdog event source: %m");
1582 r = sd_event_add_io(manager->event, &manager->ctrl_event, fd_ctrl, EPOLLIN, on_ctrl_msg, manager);
1584 return log_error_errno(r, "error creating ctrl event source: %m");
1592 return log_error_errno(r, "cold not set IDLE event priority for ctrl event source: %m");
1594 r = sd_event_add_io(manager->event, &manager->inotify_event, manager->fd_inotify, EPOLLIN, on_inotify, manager);
1596 return log_error_errno(r, "error creating inotify event source: %m");
1598 r = sd_event_add_io(manager->event, &manager->uevent_event, fd_uevent, EPOLLIN, on_uevent, manager);
1600 return log_error_errno(r, "error creating uevent event source: %m");
1602 r = sd_event_add_io(manager->event, NULL, fd_worker, EPOLLIN, on_worker, manager);
1604 return log_error_errno(r, "error creating worker event source: %m");
1606 r = sd_event_add_post(manager->event, NULL, on_post, manager);
1608 return log_error_errno(r, "error creating post event source: %m");
1634 r = sd_event_loop(manager->event);
1636 log_error_errno(r, "event loop failed: %m");
1640 sd_event_get_exit_code(manager->event, &r);