igt_core: Refactor igt_stop_helper() to use igt_wait_helper()

Reduce code duplication as the igt_stop_helper can reuse
igt_wait_helper() to replace its own waiting routine.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2014-07-24 11:44:45 +01:00
parent bd3cf81e98
commit 745945546f
3 changed files with 34 additions and 41 deletions

View File

@ -842,6 +842,29 @@ bool __igt_fork_helper(struct igt_helper_process *proc)
} }
/**
* igt_wait_helper:
* @proc: #igt_helper_process structure
*
* Joins a helper process. It is an error to call this on a helper process which
* hasn't been spawned yet.
*/
int igt_wait_helper(struct igt_helper_process *proc)
{
int status = -1;
assert(proc->running);
waitpid(proc->pid, &status, WNOHANG);
proc->running = false;
helper_process_pids[proc->id] = -1;
helper_process_count--;
return status;
}
/** /**
* igt_stop_helper: * igt_stop_helper:
* @proc: #igt_helper_process structure * @proc: #igt_helper_process structure
@ -850,49 +873,15 @@ bool __igt_fork_helper(struct igt_helper_process *proc)
* which hasn't been spawned yet. * which hasn't been spawned yet.
*/ */
void igt_stop_helper(struct igt_helper_process *proc) void igt_stop_helper(struct igt_helper_process *proc)
{
int status, ret;
assert(proc->running);
ret = kill(proc->pid,
proc->use_SIGKILL ? SIGKILL : SIGTERM);
assert(ret == 0);
while (waitpid(proc->pid, &status, 0) == -1 &&
errno == EINTR)
;
igt_assert(WIFSIGNALED(status) &&
WTERMSIG(status) == (proc->use_SIGKILL ? SIGKILL : SIGTERM));
proc->running = false;
helper_process_pids[proc->id] = -1;
helper_process_count--;
}
/**
* igt_wait_helper:
* @proc: #igt_helper_process structure
*
* Joins a helper process. It is an error to call this on a helper process which
* hasn't been spawned yet.
*/
void igt_wait_helper(struct igt_helper_process *proc)
{ {
int status; int status;
assert(proc->running); /* failure here means the pid is already dead and so waiting is safe */
kill(proc->pid, proc->use_SIGKILL ? SIGKILL : SIGTERM);
while (waitpid(proc->pid, &status, 0) == -1 && status = igt_wait_helper(proc);
errno == EINTR) assert(WIFSIGNALED(status) &&
; WTERMSIG(status) == (proc->use_SIGKILL ? SIGKILL : SIGTERM));
igt_assert(WIFEXITED(status) && WEXITSTATUS(status) == 0);
proc->running = false;
helper_process_pids[proc->id] = -1;
helper_process_count--;
} }
static void children_exit_handler(int sig) static void children_exit_handler(int sig)

View File

@ -420,7 +420,7 @@ bool __igt_fork_helper(struct igt_helper_process *proc);
*/ */
#define igt_fork_helper(proc) \ #define igt_fork_helper(proc) \
for (; __igt_fork_helper(proc); exit(0)) for (; __igt_fork_helper(proc); exit(0))
void igt_wait_helper(struct igt_helper_process *proc); int igt_wait_helper(struct igt_helper_process *proc);
void igt_stop_helper(struct igt_helper_process *proc); void igt_stop_helper(struct igt_helper_process *proc);
/* exit handler code */ /* exit handler code */

View File

@ -253,8 +253,12 @@ static void load_helper_run(enum load load)
static void load_helper_stop(void) static void load_helper_stop(void)
{ {
int status;
kill(lh.igt_proc.pid, SIGUSR1); kill(lh.igt_proc.pid, SIGUSR1);
igt_wait_helper(&lh.igt_proc); status = igt_wait_helper(&lh.igt_proc);
igt_assert(WIFSIGNALED(status) && WTERMSIG(status) == SIGUSR1);
} }
static void load_helper_init(void) static void load_helper_init(void)