Fixed race condition in safe_process.cc which may have caused some mysqltests to be reported as failed even if they succeded.
mysql-test/lib/My/SafeProcess/safe_process.cc: Fixed race condition when getting a signal while calling waitpid() Don't send kill on killed processes Return different exit codes depending on how we die.
This commit is contained in:
parent
04ff96f789
commit
4a4627104d
@ -85,16 +85,17 @@ static void die(const char* fmt, ...)
|
||||
va_end(args);
|
||||
if (int last_err= errno)
|
||||
fprintf(stderr, "error: %d, %s\n", last_err, strerror(last_err));
|
||||
exit(1);
|
||||
exit(6);
|
||||
}
|
||||
|
||||
|
||||
static void kill_child(void)
|
||||
static void kill_child(bool was_killed)
|
||||
{
|
||||
int status= 0;
|
||||
|
||||
message("Killing child: %d", child_pid);
|
||||
// Terminate whole process group
|
||||
if (! was_killed)
|
||||
kill(-child_pid, SIGKILL);
|
||||
|
||||
pid_t ret_pid= waitpid(child_pid, &status, 0);
|
||||
@ -115,7 +116,7 @@ static void kill_child(void)
|
||||
|
||||
exit(exit_code);
|
||||
}
|
||||
exit(1);
|
||||
exit(5);
|
||||
}
|
||||
|
||||
|
||||
@ -135,7 +136,7 @@ extern "C" void handle_signal(int sig)
|
||||
terminated= 1;
|
||||
|
||||
if (child_pid > 0)
|
||||
kill_child();
|
||||
kill_child(sig == SIGCHLD);
|
||||
|
||||
// Ignore further signals
|
||||
signal(SIGTERM, SIG_IGN);
|
||||
@ -240,7 +241,7 @@ int main(int argc, char* const argv[] )
|
||||
// Close write end
|
||||
close(pfd[1]);
|
||||
|
||||
if (execvp(child_argv[0], child_argv) < 0)
|
||||
execvp(child_argv[0], child_argv);
|
||||
die("Failed to exec child");
|
||||
}
|
||||
|
||||
@ -260,36 +261,16 @@ int main(int argc, char* const argv[] )
|
||||
while (!terminated)
|
||||
{
|
||||
// Check if parent is still alive
|
||||
if (kill(parent_pid, 0) != 0){
|
||||
if (kill(parent_pid, 0) != 0)
|
||||
{
|
||||
message("Parent is not alive anymore");
|
||||
break;
|
||||
}
|
||||
|
||||
// Check if child has exited, normally this will be
|
||||
// detected immediately with SIGCHLD handler
|
||||
int status= 0;
|
||||
pid_t ret_pid= waitpid(child_pid, &status, WNOHANG);
|
||||
if (ret_pid == child_pid)
|
||||
{
|
||||
int ret_code= 2;
|
||||
if (WIFEXITED(status))
|
||||
{
|
||||
// Process has exited, collect return status
|
||||
ret_code= WEXITSTATUS(status);
|
||||
message("Child exit: %d", ret_code);
|
||||
// Exit with exit status of the child
|
||||
exit(ret_code);
|
||||
}
|
||||
|
||||
if (WIFSIGNALED(status))
|
||||
message("Child killed by signal: %d", WTERMSIG(status));
|
||||
|
||||
exit(ret_code);
|
||||
}
|
||||
/* Wait for parent or child to die */
|
||||
sleep(1);
|
||||
}
|
||||
kill_child();
|
||||
kill_child(0);
|
||||
|
||||
return 1;
|
||||
return 4;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user