Lines Matching full:child

59 static void start_thread(struct child_data *child, int id)  in start_thread()  argument
69 child->pid = fork(); in start_thread()
70 if (child->pid == -1) in start_thread()
74 if (!child->pid) { in start_thread()
76 * In child, replace stdout with the pipe, errors to in start_thread()
123 * In parent, remember the child and close our copy of the in start_thread()
127 child->stdout = pipefd[0]; in start_thread()
128 child->output = NULL; in start_thread()
129 child->exited = false; in start_thread()
130 child->output_seen = false; in start_thread()
133 ev.data.ptr = child; in start_thread()
135 ret = asprintf(&child->name, "Thread-%d", id); in start_thread()
139 ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, child->stdout, &ev); in start_thread()
142 child->name, strerror(errno), errno); in start_thread()
146 ksft_print_msg("Started %s\n", child->name); in start_thread()
150 static bool child_output_read(struct child_data *child) in child_output_read() argument
156 ret = read(child->stdout, read_data, sizeof(read_data)); in child_output_read()
162 child->name, strerror(errno), in child_output_read()
168 child->output_seen = true; in child_output_read()
171 if (child->output) { in child_output_read()
172 strncpy(work, child->output, sizeof(work) - 1); in child_output_read()
174 free(child->output); in child_output_read()
175 child->output = NULL; in child_output_read()
186 ksft_print_msg("%s: %s\n", child->name, work); in child_output_read()
195 ret = asprintf(&child->output, "%s", work); in child_output_read()
203 static void child_output(struct child_data *child, uint32_t events, in child_output() argument
210 read_more = child_output_read(child); in child_output()
215 close(child->stdout); in child_output()
216 child->stdout = -1; in child_output()
220 if (flush && child->output) { in child_output()
221 ksft_print_msg("%s: %s<EOF>\n", child->name, child->output); in child_output()
222 free(child->output); in child_output()
223 child->output = NULL; in child_output()
227 static void child_tickle(struct child_data *child) in child_tickle() argument
229 if (child->output_seen && !child->exited) in child_tickle()
230 kill(child->pid, SIGUSR1); in child_tickle()
233 static void child_stop(struct child_data *child) in child_stop() argument
235 if (!child->exited) in child_stop()
236 kill(child->pid, SIGTERM); in child_stop()
239 static void child_cleanup(struct child_data *child) in child_cleanup() argument
245 if (!child->exited) { in child_cleanup()
247 ret = waitpid(child->pid, &status, 0); in child_cleanup()
253 child->pid, strerror(errno), in child_cleanup()
260 child->exit_status = WEXITSTATUS(status); in child_cleanup()
261 child->exited = true; in child_cleanup()
265 child->exit_signal = WTERMSIG(status); in child_cleanup()
267 child->name, child->exit_signal); in child_cleanup()
269 child->exited = true; in child_cleanup()
271 } while (!child->exited); in child_cleanup()
274 if (!child->output_seen) { in child_cleanup()
275 ksft_print_msg("%s no output seen\n", child->name); in child_cleanup()
279 if (child->exit_status != 0) { in child_cleanup()
281 child->name, child->exit_status); in child_cleanup()
285 ksft_test_result(!fail, "%s\n", child->name); in child_cleanup()
401 ksft_exit_fail_msg("Unable to allocate child data\n"); in main()
483 * If the child processes have not produced output they in main()