From 5d4144a82674467bccbfe30f42382ed0905026d0 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Fri, 2 Mar 2012 18:20:45 +1100 Subject: selftest: close stdin and wait with waitpid() for a safer exit This avoids timelimit sending kill -9 after 1 second, which may disrupt the writing of gcov data. Andrew Bartlett --- selftest/target/Samba3.pm | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) (limited to 'selftest/target/Samba3.pm') diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm index 0ea63db8c4..c9ad7d31fe 100755 --- a/selftest/target/Samba3.pm +++ b/selftest/target/Samba3.pm @@ -43,17 +43,45 @@ sub new($$) { sub teardown_env($$) { my ($self, $envvars) = @_; + my $count = 0; + + # This should cause smbd to terminate gracefully + close($envvars->{STDIN_PIPE}); my $smbdpid = read_pid($envvars, "smbd"); my $nmbdpid = read_pid($envvars, "nmbd"); my $winbinddpid = read_pid($envvars, "winbindd"); + until (kill(0, $smbdpid, $nmbdpid, $winbinddpid) == 0) { + my $childpid = waitpid(-1, WNOHANG); + # This should give it time to write out the gcov data + sleep(1); + $count++; + last if $childpid == 0 or $count > 20; + } + + if ($count <= 20) { + return; + } + $self->stop_sig_term($smbdpid); $self->stop_sig_term($nmbdpid); $self->stop_sig_term($winbinddpid); - sleep(2); + $count = 0; + until (kill(0, $smbdpid, $nmbdpid, $winbinddpid) == 0) { + # if no process sucessfully signalled, then we are done + my $childpid = waitpid(-1, WNOHANG); + sleep(1); + $count++; + last if $childpid == 0 or $count > 20; + } + + if ($count <= 10) { + return; + } + warn("timelimit process did not quit on SIGTERM, sending SIGKILL"); $self->stop_sig_kill($smbdpid); $self->stop_sig_kill($nmbdpid); $self->stop_sig_kill($winbinddpid); @@ -98,6 +126,8 @@ sub check_env($$) { my ($self, $envvars) = @_; + my $childpid = waitpid(-1, WNOHANG); + # TODO ... return 1; } -- cgit