runtests: assume Time::HiRes, drop Perl Win32 dependency

`Time::HiRes` was already used unconditionally before this patch in
`servers.pm`. This package, and functions used by runtests (`sleep` and
`gettimeofday`) are supported by the minimum Perl version required for
curl:

https://perldoc.perl.org/5.8.0/Time::HiRes

- Drop the `portable_sleep()` wrapper in favor of `Time::HiRes::sleep()`.
- Use `Time::HiRes` unconditionally in `serverhelp.pm`.
- Stop using the `Win32` package where available. It was included
  to provide a Windows fallback for `Time::HiRes::sleep()`. It was never
  actually called, but the dependency may have loaded `Win32.dll`, which
  often appears in failed fork operations in GHA logs.
  Ref: a6fed41f6f12f3b71cfe85609f02a294b972d3d3 #5054 #5034
  Ref: https://github.com/curl/curl/discussions/14854

Closes #18287
This commit is contained in:
Viktor Szakats 2025-08-14 13:36:04 +02:00
parent c24d4be057
commit be01b60ce5
No known key found for this signature in database
GPG Key ID: B5ABD165E2AEF201
6 changed files with 18 additions and 68 deletions

View File

@ -51,6 +51,7 @@ BEGIN {
use IPC::Open2;
use Digest::MD5;
use File::Basename;
use Time::HiRes;
use directories;
@ -484,7 +485,7 @@ sub sendcontrol {
for(@a) {
sockfilt $_;
portable_sleep($ctrldelay);
Time::HiRes::sleep($ctrldelay);
}
}
my $log;
@ -521,7 +522,7 @@ sub senddata {
# pause between each byte
for (split(//,$l)) {
sockfiltsecondary $_;
portable_sleep($datadelay);
Time::HiRes::sleep($datadelay);
}
}
}
@ -3292,7 +3293,7 @@ while(1) {
logmsg("Sleep for $delay seconds\n");
my $twentieths = $delay * 20;
while($twentieths--) {
portable_sleep(0.05) unless($got_exit_signal);
Time::HiRes::sleep(0.05) unless($got_exit_signal);
}
}

View File

@ -27,11 +27,12 @@ package processhelp;
use strict;
use warnings;
use Time::HiRes;
BEGIN {
use base qw(Exporter);
our @EXPORT = qw(
portable_sleep
pidfromfile
pidexists
pidwait
@ -42,17 +43,6 @@ BEGIN {
set_advisor_read_lock
clear_advisor_read_lock
);
# portable sleeping needs Time::HiRes
eval {
no warnings "all";
require Time::HiRes;
};
# portable sleeping falls back to native Sleep on Windows
eval {
no warnings "all";
require Win32;
}
}
use serverhelp qw(
@ -69,27 +59,6 @@ use globalconfig qw(
$dev_null
);
#######################################################################
# 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
# Therefore it uses Win32::Sleep on Windows systems instead.
#
sub portable_sleep {
my ($seconds) = @_;
if($Time::HiRes::VERSION) {
Time::HiRes::sleep($seconds);
}
elsif(os_is_win()) {
Win32::Sleep($seconds*1000);
}
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
@ -238,7 +207,7 @@ sub pidwait {
last;
}
}
portable_sleep(0.2);
Time::HiRes::sleep(0.2);
}
return $pid;
}
@ -346,7 +315,7 @@ sub killpid {
last if(not scalar(@signalled));
# give any zombies of us a chance to move on to the afterlife
pidwait(0, &WNOHANG);
portable_sleep(0.05);
Time::HiRes::sleep(0.05);
}
}

View File

@ -39,6 +39,7 @@ use warnings;
use 5.006;
use File::Basename;
use Time::HiRes;
BEGIN {
use base qw(Exporter);
@ -84,9 +85,6 @@ use Storable qw(
use pathhelp qw(
exe_ext
);
use processhelp qw(
portable_sleep
);
use servers qw(
checkcmd
initserverconfig
@ -419,7 +417,7 @@ sub waitlockunlock {
my $lockretry = $serverlogslocktimeout * 20;
my @locks;
while((@locks = logslocked()) && $lockretry--) {
portable_sleep(0.05);
Time::HiRes::sleep(0.05);
}
if(($lockretry < 0) &&
($serverlogslocktimeout >= $defserverlogslocktimeout)) {
@ -1092,7 +1090,7 @@ sub singletest_clean {
}
}
portable_sleep($postcommanddelay) if($postcommanddelay);
Time::HiRes::sleep($postcommanddelay) if($postcommanddelay);
my @killtestservers = getpart("client", "killserver");
if(@killtestservers) {

View File

@ -92,9 +92,6 @@ use pathhelp qw(
exe_ext
sys_native_current_path
);
use processhelp qw(
portable_sleep
);
use appveyor;
use azure;

View File

@ -29,6 +29,8 @@ package serverhelp;
use strict;
use warnings;
use Time::HiRes;
BEGIN {
use base qw(Exporter);
@ -52,13 +54,6 @@ BEGIN {
datasockf_pidfilename
datasockf_logfilename
);
# sub second timestamping needs Time::HiRes
eval {
no warnings "all";
require Time::HiRes;
import Time::HiRes qw( gettimeofday );
}
}
use globalconfig;
@ -81,20 +76,10 @@ our $logfile; # server log file name, for logmsg
# logmsg is general message logging subroutine for our test servers.
#
sub logmsg {
my $now;
# sub second timestamping needs Time::HiRes
if($Time::HiRes::VERSION) {
my ($seconds, $usec) = gettimeofday();
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime($seconds);
$now = sprintf("%02d:%02d:%02d.%06d ", $hour, $min, $sec, $usec);
}
else {
my $seconds = time();
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime($seconds);
$now = sprintf("%02d:%02d:%02d ", $hour, $min, $sec);
}
my ($seconds, $usec) = Time::HiRes::gettimeofday();
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime($seconds);
my $now = sprintf("%02d:%02d:%02d.%06d ", $hour, $min, $sec, $usec);
# we see warnings on Windows run that $logfile is used uninitialized
# TODO: not found yet where this comes from
$logfile = "serverhelp_uninitialized.log" if(!$logfile);

View File

@ -380,7 +380,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
portable_sleep($timeout);
Time::HiRes::sleep($timeout);
if(checkdied($child)) {
logmsg "startnew: child process has failed to start\n" if($verbose);
return (-1,-1);