X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=gui.c;fp=gui.c;h=92b7f7cfa0a7826ab5ca95ded4d4a8ca340f46d9;hp=b077b00aa9dd08a5c01dbdec06003781013d11cb;hb=8aa9d0cddfefb882cfd8e7cadbeea5cce31b731f;hpb=015183e5aa7858d2988ff0c0fb9c997aadeeca0c diff --git a/gui.c b/gui.c index b077b00a..92b7f7cf 100644 --- 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); }