]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - gui.c
Merge branch 't/sched_improvements'
[paraslash.git] / gui.c
diff --git a/gui.c b/gui.c
index b077b00aa9dd08a5c01dbdec06003781013d11cb..92b7f7cfa0a7826ab5ca95ded4d4a8ca340f46d9 100644 (file)
--- a/gui.c
+++ b/gui.c
@@ -124,11 +124,11 @@ GUI_COMMANDS
 static struct gui_command command_list[] = {GUI_COMMANDS {.name = NULL}};
 
 struct input_task {
-       struct task task;
+       struct task *task;
 };
 
 struct status_task {
-       struct task task;
+       struct task *task;
        pid_t pid;
        char *buf;
        int bufsize, loaded;
@@ -140,7 +140,7 @@ struct status_task {
 #define COMMAND_BUF_SIZE 32768
 
 struct exec_task {
-       struct task task;
+       struct task *task;
        char command_buf[2][COMMAND_BUF_SIZE]; /* stdout/stderr of command */
        int cbo[2]; /* command buf offsets */
        unsigned flags[2]; /* passed to for_each_line() */
@@ -597,25 +597,25 @@ static void clear_all_items(void)
        }
 }
 
-static void status_pre_select(struct sched *s, struct task *t)
+static void status_pre_select(struct sched *s, void *context)
 {
-       struct status_task *st = container_of(t, struct status_task, task);
+       struct status_task *st = context;
 
        if (st->fd >= 0)
                para_fd_set(st->fd, &s->rfds, &s->max_fileno);
-       if (task_get_notification(t) < 0)
+       if (task_get_notification(st->task) < 0)
                return sched_min_delay(s);
        if (st->fd < 0)
                sched_request_barrier_or_min_delay(&st->next_exec, s);
 }
 
-static int status_post_select(struct sched *s, struct task *t)
+static int status_post_select(struct sched *s, void *context)
 {
-       struct status_task *st = container_of(t, struct status_task, task);
+       struct status_task *st = context;
        size_t sz;
        int ret, ret2;
 
-       ret = task_get_notification(t);
+       ret = task_get_notification(st->task);
        if (ret == -E_GUI_SIGCHLD && st->pid > 0) {
                int exit_status;
                if (waitpid(st->pid, &exit_status, WNOHANG) == st->pid) {
@@ -897,7 +897,7 @@ static void reread_conf(void)
 /*
  * React to various signal-related events
  */
-static int signal_post_select(struct sched *s, __a_unused struct task *t)
+static int signal_post_select(struct sched *s, __a_unused void *context)
 {
        int ret = para_next_signal(&s->rfds);
 
@@ -933,22 +933,23 @@ static enum exec_status exec_status(void)
        return EXEC_IDLE;
 }
 
-static void exec_pre_select(struct sched *s, struct task *t)
+static void exec_pre_select(struct sched *s, void *context)
 {
+       struct exec_task *et = context;
        if (exec_fds[0] >= 0)
                para_fd_set(exec_fds[0], &s->rfds, &s->max_fileno);
        if (exec_fds[1] >= 0)
                para_fd_set(exec_fds[1], &s->rfds, &s->max_fileno);
-       if (task_get_notification(t) < 0)
+       if (task_get_notification(et->task) < 0)
                sched_min_delay(s);
 }
 
-static int exec_post_select(struct sched *s, struct task *t)
+static int exec_post_select(struct sched *s, void *context)
 {
-       struct exec_task *ct = container_of(t, struct exec_task, task);
+       struct exec_task *ct = context;
        int i, ret;
 
-       ret = task_get_notification(t);
+       ret = task_get_notification(ct->task);
        if (ret == -E_GUI_SIGCHLD && exec_pid > 0) {
                int exit_status;
                if (waitpid(exec_pid, &exit_status, WNOHANG) == exec_pid) {
@@ -993,7 +994,7 @@ static int exec_post_select(struct sched *s, struct task *t)
        return 0;
 }
 
-static void input_pre_select(struct sched *s, __a_unused struct task *t)
+static void input_pre_select(struct sched *s, __a_unused void *context)
 {
        if (exec_status() != EXEC_XCMD)
                para_fd_set(STDIN_FILENO, &s->rfds, &s->max_fileno);
@@ -1090,7 +1091,7 @@ static void handle_command(int c)
                km_keyname(c));
 }
 
-static int input_post_select(__a_unused struct sched *s, __a_unused struct task *t)
+static int input_post_select(__a_unused struct sched *s, __a_unused void *context)
 {
        int ret;
        enum exec_status exs = exec_status();
@@ -1130,9 +1131,9 @@ static int input_post_select(__a_unused struct sched *s, __a_unused struct task
        return 0;
 }
 
-static void signal_pre_select(struct sched *s, struct task *t)
+static void signal_pre_select(struct sched *s, void *context)
 {
-       struct signal_task *st = container_of(t, struct signal_task, task);
+       struct signal_task *st = context;
        para_fd_set(st->fd, &s->rfds, &s->max_fileno);
 }
 
@@ -1406,51 +1407,49 @@ __noreturn static void print_help_and_die(void)
 
 static int setup_tasks_and_schedule(void)
 {
+       struct exec_task exec_task = {.task = NULL};
+       struct status_task status_task = {.fd = -1};
+       struct input_task input_task = {.task = NULL};
+       struct signal_task signal_task = {.task = NULL};
        struct sched sched = {
                .default_timeout = {
                        .tv_sec = conf.timeout_arg  / 1000,
                        .tv_usec = (conf.timeout_arg % 1000) * 1000,
                },
        };
-       struct exec_task exec_task = {
-               .task = {
-                       .status = "exec",
-                       .pre_select = exec_pre_select,
-                       .post_select = exec_post_select,
-               },
-       };
-       struct status_task status_task = {
-               .task = {
-                       .status = "status",
-                       .pre_select = status_pre_select,
-                       .post_select = status_post_select,
-               },
-               .fd = -1
-       };
-       struct input_task input_task = {
-               .task = {
-                       .status = "input",
-                       .pre_select = input_pre_select,
-                       .post_select = input_post_select,
-               },
-       };
-       struct signal_task signal_task = {
-               .task = {
-                       .status = "signal",
-                       .pre_select = signal_pre_select,
-                       .post_select = signal_post_select,
-               },
-       };
+
+       exec_task.task = task_register(&(struct task_info) {
+               .name = "exec",
+               .pre_select = exec_pre_select,
+               .post_select = exec_post_select,
+               .context = &exec_task,
+       }, &sched);
+
+       status_task.task = task_register(&(struct task_info) {
+               .name = "status",
+               .pre_select = status_pre_select,
+               .post_select = status_post_select,
+               .context = &status_task,
+       }, &sched);
+
+       input_task.task = task_register(&(struct task_info) {
+               .name = "input",
+               .pre_select = input_pre_select,
+               .post_select = input_post_select,
+               .context = &input_task,
+       }, &sched);
+
        signal_task.fd = para_signal_init();
        para_install_sighandler(SIGINT);
        para_install_sighandler(SIGTERM);
        para_install_sighandler(SIGCHLD);
        para_install_sighandler(SIGUSR1);
-
-       register_task(&sched, &exec_task.task);
-       register_task(&sched, &status_task.task);
-       register_task(&sched, &input_task.task);
-       register_task(&sched, &signal_task.task);
+       signal_task.task = task_register(&(struct task_info) {
+               .name = "signal",
+               .pre_select = signal_pre_select,
+               .post_select = signal_post_select,
+               .context = &signal_task,
+       }, &sched);
        return schedule(&sched);
 }