=back
+=item *
+
+Notes :
+
+=over 8
+
+=item -
+
+C<< exit => 'threads_only' >> is passed to C<< threads->import >>.
+
+=back
+
=back
=cut
die "$test_module was loaded too soon" if defined $test_module;
}
- load_or_skip_all 'threads', $force ? '0' : '1.67', [ ];
+ load_or_skip_all 'threads', $force ? '0' : '1.67', [
+ exit => 'threads_only',
+ ];
load_or_skip_all 'threads::shared', $force ? '0' : '1.14', [ ];
diag "Threads testing forced by \$ENV{$force_var}" if $force;
=item -
-C<@impls> is the list of desired implementations (which may be C<'Time::HiRes'> or C<'sleep'>), in the order they should be checked.
+C<@impls> is the list of desired implementations (which may be C<'Time::HiRes'>, C<'select'> or C<'sleep'>), in the order they should be checked.
When the list is empty, it defaults to all of them.
=back
return undef;
}
},
+ 'select' => sub {
+ if ($Config::Config{d_select}) {
+ diag 'Using select()-based fallback usleep()';
+ return sub ($) {
+ my $s = $_[0];
+ my $r = 0;
+ while ($s > 0) {
+ my ($found, $t) = select(undef, undef, undef, $s / 1e6);
+ last unless defined $t;
+ $t = int($t * 1e6);
+ $s -= $t;
+ $r += $t;
+ }
+ return $r;
+ };
+ } else {
+ return undef;
+ }
+ },
'sleep' => sub {
diag 'Using sleep()-based fallback usleep()';
- return sub {
- my $s = int($_[0] / 1e6);
- my $t = sleep $s;
+ return sub ($) {
+ my $ms = int $_[0];
+ my $s = int($ms / 1e6) + ($ms % 1e6 == 0 ? 0 : 1);
+ my $t = sleep $s;
return $t * 1e6;
};
},
);
- @impls = qw<Time::HiRes sleep> unless @impls;
+ @impls = qw<Time::HiRes select sleep> unless @impls;
my $usleep;
for my $impl (@impls) {