tests: add Windows compatible pidwait like pidkill and pidterm

Related to #5188
This commit is contained in:
Marc Hoersken 2020-04-10 21:25:55 +02:00
parent 3f60a9e995
commit 2a93021750
No known key found for this signature in database
GPG Key ID: 61E03CBED7BC859E
3 changed files with 33 additions and 11 deletions

View File

@ -51,7 +51,7 @@ use pathhelp qw(
# to the classic approach of using select(undef, undef, undef, ...). # to the classic approach of using select(undef, undef, undef, ...).
# even though that one is not portable due to being implemented using # even though that one is not portable due to being implemented using
# select on Windows: https://perldoc.perl.org/perlport.html#select # select on Windows: https://perldoc.perl.org/perlport.html#select
# On Windows it also just uses full-second sleep for waits >1 second. # Therefore it uses Win32::Sleep on Windows systems instead.
# #
sub portable_sleep { sub portable_sleep {
my ($seconds) = @_; my ($seconds) = @_;
@ -143,7 +143,7 @@ sub pidterm {
} }
####################################################################### #######################################################################
# pidkill kills the process with a given pid mercilessly andforcefully. # pidkill kills the process with a given pid mercilessly and forcefully.
# #
sub pidkill { sub pidkill {
my $pid = $_[0]; my $pid = $_[0];
@ -169,6 +169,28 @@ sub pidkill {
} }
} }
#######################################################################
# pidwait waits for the process with a given pid to be terminated.
#
sub pidwait {
my $pid = $_[0];
my $flags = $_[1];
# check if the process exists
if ($pid > 65536 && os_is_win()) {
if($flags == &WNOHANG) {
return pidexists($pid)?0:$pid;
}
while(pidexists($pid)) {
portable_sleep(0.01);
}
return $pid;
}
# wait on the process to terminate
return waitpid($pid, $flags);
}
####################################################################### #######################################################################
# processexists checks if a process with the pid stored in the given # processexists checks if a process with the pid stored in the given
# pidfile exists and is alive. This will return 0 on any file related # pidfile exists and is alive. This will return 0 on any file related
@ -193,7 +215,7 @@ sub processexists {
# get rid of the certainly invalid pidfile # get rid of the certainly invalid pidfile
unlink($pidfile) if($pid == pidfromfile($pidfile)); unlink($pidfile) if($pid == pidfromfile($pidfile));
# reap its dead children, if not done yet # reap its dead children, if not done yet
waitpid($pid, &WNOHANG); pidwait($pid, &WNOHANG);
# negative return value means dead process # negative return value means dead process
return -$pid; return -$pid;
} }
@ -243,7 +265,7 @@ sub killpid {
print("RUN: Process with pid $pid already dead\n") print("RUN: Process with pid $pid already dead\n")
if($verbose); if($verbose);
# if possible reap its dead children # if possible reap its dead children
waitpid($pid, &WNOHANG); pidwait($pid, &WNOHANG);
push @reapchild, $pid; push @reapchild, $pid;
} }
} }
@ -261,7 +283,7 @@ sub killpid {
if($verbose); if($verbose);
splice @signalled, $i, 1; splice @signalled, $i, 1;
# if possible reap its dead children # if possible reap its dead children
waitpid($pid, &WNOHANG); pidwait($pid, &WNOHANG);
push @reapchild, $pid; push @reapchild, $pid;
} }
} }
@ -278,7 +300,7 @@ sub killpid {
if($verbose); if($verbose);
pidkill($pid); pidkill($pid);
# if possible reap its dead children # if possible reap its dead children
waitpid($pid, &WNOHANG); pidwait($pid, &WNOHANG);
push @reapchild, $pid; push @reapchild, $pid;
} }
} }
@ -288,7 +310,7 @@ sub killpid {
if(@reapchild) { if(@reapchild) {
foreach my $pid (@reapchild) { foreach my $pid (@reapchild) {
if($pid > 0) { if($pid > 0) {
waitpid($pid, 0); pidwait($pid, 0);
} }
} }
} }
@ -317,7 +339,7 @@ sub killsockfilters {
printf("* kill pid for %s-%s => %d\n", $server, printf("* kill pid for %s-%s => %d\n", $server,
($proto eq 'ftp')?'ctrl':'filt', $pid) if($verbose); ($proto eq 'ftp')?'ctrl':'filt', $pid) if($verbose);
pidkill($pid); pidkill($pid);
waitpid($pid, 0); pidwait($pid, 0);
} }
unlink($pidfile) if(-f $pidfile); unlink($pidfile) if(-f $pidfile);
} }
@ -331,7 +353,7 @@ sub killsockfilters {
printf("* kill pid for %s-data => %d\n", $server, printf("* kill pid for %s-data => %d\n", $server,
$pid) if($verbose); $pid) if($verbose);
pidkill($pid); pidkill($pid);
waitpid($pid, 0); pidwait($pid, 0);
} }
unlink($pidfile) if(-f $pidfile); unlink($pidfile) if(-f $pidfile);
} }

View File

@ -703,7 +703,7 @@ sub close_dataconn {
logmsg "DATA sockfilt for $datasockf_mode data channel quits ". logmsg "DATA sockfilt for $datasockf_mode data channel quits ".
"(pid $datapid)\n"; "(pid $datapid)\n";
print DWRITE "QUIT\n"; print DWRITE "QUIT\n";
waitpid($datapid, 0); pidwait($datapid, 0);
unlink($datasockf_pidfile) if(-f $datasockf_pidfile); unlink($datasockf_pidfile) if(-f $datasockf_pidfile);
logmsg "DATA sockfilt for $datasockf_mode data channel quit ". logmsg "DATA sockfilt for $datasockf_mode data channel quit ".
"(pid $datapid)\n"; "(pid $datapid)\n";

View File

@ -441,7 +441,7 @@ sub checkdied {
if((not defined $pid) || $pid <= 0) { if((not defined $pid) || $pid <= 0) {
return 0; return 0;
} }
my $rc = waitpid($pid, &WNOHANG); my $rc = pidwait($pid, &WNOHANG);
return ($rc == $pid)?1:0; return ($rc == $pid)?1:0;
} }