From: Marc Hoersken Date: Wed, 4 Mar 2020 10:44:49 +0000 (+0100) Subject: tests: try to make sleeping portable by avoiding select X-Git-Tag: curl-7_69_1~45 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9aaca09044de4d4116822f25d2cf9c780d7465ce;p=thirdparty%2Fcurl.git tests: try to make sleeping portable by avoiding select select does not support just waiting on Windows: https://perldoc.perl.org/perlport.html#select Reviewed-By: Daniel Stenberg Closes #5035 --- diff --git a/tests/ftp.pm b/tests/ftp.pm index f4a4acedd4..f7298bce61 100644 --- a/tests/ftp.pm +++ b/tests/ftp.pm @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2010, Daniel Stenberg, , et al. +# Copyright (C) 1998 - 2020, Daniel Stenberg, , et al. # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms @@ -20,6 +20,14 @@ # ########################################################################### +BEGIN { + # portable sleeping needs Time::HiRes + eval { + no warnings "all"; + require Time::HiRes; + } +} + use strict; use warnings; @@ -29,6 +37,27 @@ use serverhelp qw( datasockf_pidfilename ); +####################################################################### +# portable_sleep uses Time::HiRes::sleep if available and falls back +# to the classic approach of using select(undef, undef, undef, ...). +# even though that one is not portable due to being implemented using +# select on Windows: https://perldoc.perl.org/perlport.html#select +# On Windows it also just uses full-second sleep for waits >1 second. +# +sub portable_sleep { + my ($seconds) = @_; + + if($Time::HiRes::VERSION) { + Time::HiRes::sleep($seconds); + } + elsif ($seconds > 1 && ($^O eq 'MSWin32' || $^O eq 'msys')) { + sleep($seconds); + } + else { + select(undef, undef, undef, $seconds); + } +} + ####################################################################### # pidfromfile returns the pid stored in the given pidfile. The value # of the returned pid will never be a negative value. It will be zero @@ -216,7 +245,7 @@ sub killpid { } } last if(not scalar(@signalled)); - select(undef, undef, undef, 0.05); + portable_sleep(0.05); } } diff --git a/tests/ftpserver.pl b/tests/ftpserver.pl index 63dc3342c7..431bd25862 100755 --- a/tests/ftpserver.pl +++ b/tests/ftpserver.pl @@ -493,7 +493,7 @@ sub sendcontrol { for(@a) { sockfilt $_; - select(undef, undef, undef, 0.01); + portable_sleep(0.01); } } my $log; @@ -530,7 +530,7 @@ sub senddata { # pause between each byte for (split(//,$l)) { sockfiltsecondary $_; - select(undef, undef, undef, 0.01); + portable_sleep(0.01); } } } @@ -3199,7 +3199,7 @@ while(1) { logmsg("Sleep for $delay seconds\n"); my $twentieths = $delay * 20; while($twentieths--) { - select(undef, undef, undef, 0.05) unless($got_exit_signal); + portable_sleep(0.05) unless($got_exit_signal); } } diff --git a/tests/runtests.pl b/tests/runtests.pl index 3306de397a..7a5f8a5047 100755 --- a/tests/runtests.pl +++ b/tests/runtests.pl @@ -482,7 +482,7 @@ sub startnew { logmsg "startnew: failed to write fake $pidfile with pid=$child\n"; } # could/should do a while connect fails sleep a bit and loop - sleep $timeout; + portable_sleep($timeout); if (checkdied($child)) { logmsg "startnew: child process has failed to start\n" if($verbose); return (-1,-1); @@ -3823,7 +3823,7 @@ sub singletest { if($serverlogslocktimeout) { my $lockretry = $serverlogslocktimeout * 20; while((-f $SERVERLOGS_LOCK) && $lockretry--) { - select(undef, undef, undef, 0.05); + portable_sleep(0.05); } if(($lockretry < 0) && ($serverlogslocktimeout >= $defserverlogslocktimeout)) { @@ -3840,7 +3840,7 @@ sub singletest { # based tests might need a small delay once that the client command has # run to avoid false test failures. - sleep($postcommanddelay) if($postcommanddelay); + portable_sleep($postcommanddelay) if($postcommanddelay); # timestamp removal of server logs advisor read lock $timesrvrlog{$testnum} = Time::HiRes::time();