From: Andre Noll Date: Wed, 8 Jan 2014 05:16:15 +0000 (+0000) Subject: task_register() conversion: stdin task X-Git-Tag: v0.5.3~8^2~28 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=e58586b7395a84e5883b077d89b92c8ac649a1f2;hp=8bf35b38357c3ce59f52ae87f6e84e4b6d183ac7 task_register() conversion: stdin task This renames stdin_set_defaults() to stdin_task_register() and changes the function to register the stdin task. Before this patch, the task was registered in the callers. --- diff --git a/client.c b/client.c index 338f05c8..56e7cc5c 100644 --- a/client.c +++ b/client.c @@ -544,8 +544,7 @@ static int supervisor_post_select(struct sched *s, struct task *t) return 1; } if (ct->status == CL_SENDING) { - stdin_set_defaults(&sit); - register_task(s, &sit.task); + stdin_task_register(&sit, s); return -E_TASK_STARTED; } return 0; diff --git a/filter.c b/filter.c index 69b12d7a..7e3575fa 100644 --- a/filter.c +++ b/filter.c @@ -112,8 +112,7 @@ int main(int argc, char *argv[]) goto out; sit->btrn = btr_new_node(&(struct btr_node_description) EMBRACE(.name = "stdin")); - stdin_set_defaults(sit); - register_task(&s, &sit->task); + stdin_task_register(sit, &s); fns = para_malloc(conf.filter_given * sizeof(*fns)); for (i = 0, parent = sit->btrn; i < conf.filter_given; i++) { diff --git a/stdin.c b/stdin.c index d5425b28..ed663169 100644 --- a/stdin.c +++ b/stdin.c @@ -30,7 +30,7 @@ */ static void stdin_pre_select(struct sched *s, struct task *t) { - struct stdin_task *sit = container_of(t, struct stdin_task, task); + struct stdin_task *sit = task_context(t); int ret; ret = btr_node_status(sit->btrn, 0, BTR_NT_ROOT); @@ -56,7 +56,7 @@ static void stdin_pre_select(struct sched *s, struct task *t) */ static int stdin_post_select(struct sched *s, struct task *t) { - struct stdin_task *sit = container_of(t, struct stdin_task, task); + struct stdin_task *sit = task_context(t); ssize_t ret; size_t sz, n; char *buf = NULL; @@ -95,21 +95,25 @@ err: } /** - * Initialize a stdin task structure with default values. + * Register a stdin task structure. * - * \param sit The stdin task structure. + * \param sit The stdin task structure to register. + * \param s The task will be added to this scheduler's task list. * - * This fills in the pre/post select function pointers of the task structure - * given by \a sit and creates a buffer tree for I/O. + * This allocates a buffer tree pool for I/O, sets up \a sit and registers a + * task with \a sit as context pointer. */ -void stdin_set_defaults(struct stdin_task *sit) +void stdin_task_register(struct stdin_task *sit, struct sched *s) { int ret; + struct task_info ti = { + .name = "stdin", + .pre_select = stdin_pre_select, + .post_select = stdin_post_select, + .context = sit, + }; - sit->task.pre_select = stdin_pre_select; - sit->task.post_select = stdin_post_select; sit->btrp = btr_pool_new("stdin", 128 * 1024); - sprintf(sit->task.status, "stdin reader"); /* * Both STDIN_FILENO and STDOUT_FILENO may refer to the same open file * description (the terminal), and thus share the same file status @@ -124,4 +128,5 @@ void stdin_set_defaults(struct stdin_task *sit) } sit->fd_flags = ret; sit->must_set_nonblock_flag = (sit->fd_flags & O_NONBLOCK) == 0; + sit->task = task_register(&ti, s); } diff --git a/stdin.h b/stdin.h index 22ea7ed6..b40cf7eb 100644 --- a/stdin.h +++ b/stdin.h @@ -9,7 +9,7 @@ /** The task structure used for reading from stdin. */ struct stdin_task { /** The task structure. */ - struct task task; + struct task *task; /** Stdin is always the root of a buffer tree. */ struct btr_node *btrn; /** Use a buffer pool to minimize memcpy due to alignment problems. */ @@ -20,4 +20,4 @@ struct stdin_task { bool must_set_nonblock_flag; }; -void stdin_set_defaults(struct stdin_task *sit); +void stdin_task_register(struct stdin_task *sit, struct sched *s); diff --git a/write.c b/write.c index 4ed5f72e..aa230f59 100644 --- a/write.c +++ b/write.c @@ -104,8 +104,7 @@ static int setup_and_schedule(void) sit.btrn = btr_new_node(&(struct btr_node_description) EMBRACE(.name = "stdin")); - stdin_set_defaults(&sit); - register_task(&s, &sit.task); + stdin_task_register(&sit, &s); COPY_WAV_PARMS(&wp, &conf); wt.cwc = check_wav_init(sit.btrn, NULL, &wp, &cw_btrn); @@ -149,6 +148,7 @@ static int setup_and_schedule(void) } free(wns); check_wav_shutdown(wt.cwc); + sched_shutdown(&s); return ret; }