+static int running_moveto_queue(struct hotplug_msg *msg)
+{
+ dbg("move sequence %d [%d] to running queue '%s'",
+ msg->seqnum, msg->pid, msg->devpath);
+ list_move_tail(&msg->list, &running_list);
+ return 0;
+}
+
+static int running_remove_queue(pid_t pid)
+{
+ struct hotplug_msg *child;
+ struct hotplug_msg *tmp_child;
+
+ list_for_each_entry_safe(child, tmp_child, &running_list, list)
+ if (child->pid == pid) {
+ list_del_init(&child->list);
+ free(child);
+ return 0;
+ }
+ return -EINVAL;
+}
+
+static pid_t running_getpid_by_devpath(struct hotplug_msg *msg)
+{
+ struct hotplug_msg *child;
+ struct hotplug_msg *tmp_child;
+
+ list_for_each_entry_safe(child, tmp_child, &running_list, list)
+ if (strncmp(child->devpath, msg->devpath, sizeof(child->devpath)) == 0)
+ return child->pid;
+ return 0;
+}
+
+static void delayed_dump_queue(void)
+{
+ struct hotplug_msg *child;
+
+ list_for_each_entry(child, &delayed_list, list)
+ dbg("event for '%s' in queue", child->devpath);
+}
+
+static int delayed_moveto_queue(struct hotplug_msg *msg)
+{
+ dbg("move event to delayed queue '%s'", msg->devpath);
+ list_move_tail(&msg->list, &delayed_list);
+ return 0;
+}
+
+static void delayed_check_queue(void)
+{
+ struct hotplug_msg *delayed_child;
+ struct hotplug_msg *running_child;
+ struct hotplug_msg *tmp_child;
+
+ /* see if we have delayed exec's that can run now */
+ list_for_each_entry_safe(delayed_child, tmp_child, &delayed_list, list)
+ list_for_each_entry_safe(running_child, tmp_child, &running_list, list)
+ if (strncmp(delayed_child->devpath, running_child->devpath,
+ sizeof(running_child->devpath)) == 0) {
+ dbg("delayed exec for '%s' can run now", delayed_child->devpath);
+ msg_exec(delayed_child);
+ }