X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FIPC-MorseSignals.git;a=blobdiff_plain;f=samples%2Fbench.pl;h=d45e950bdb600f188e6d0960723eedf3b15a5e18;hp=45b485b901706a12db19ad53675077f7bc8ca76f;hb=eccac2c27337a828907205353fc7907da4c3e4a4;hpb=133946d2bfe0a5d47755a8f182a76e2f57b72e20 diff --git a/samples/bench.pl b/samples/bench.pl index 45b485b..d45e950 100755 --- a/samples/bench.pl +++ b/samples/bench.pl @@ -3,7 +3,7 @@ use strict; use warnings; -use POSIX qw/SIGINT SIGTERM SIGKILL EXIT_SUCCESS/; +use POSIX qw/SIGINT SIGTERM SIGKILL EXIT_SUCCESS EXIT_FAILURE WIFEXITED WEXITSTATUS/; use lib qw{blib/lib}; @@ -16,67 +16,59 @@ sub tryspeed { my $speed = 2 ** 16; my $ok = 0; my $desc; - while ($speed && $ok < $n) { - $desc = "$n sends of $l bytes at $speed bits/s"; +SPEED: + while (($speed > 1) && ($ok < $n)) { $speed /= 2; + $desc = "$n sends of $l bytes at $speed bits/s"; $ok = 0; print STDERR "try $desc"; -TRY: for (1 .. $n) { print STDERR "."; my @alpha = ('a' .. 'z'); my $msg = join '', map { $alpha[rand @alpha] } 1 .. $l; - pipe my $rdr, my $wtr or die "$desc: pipe() failed : $!"; my $pid = fork; if (!defined $pid) { die "$desc: fork() failed : $!"; } elsif ($pid == 0) { - close $rdr; local @SIG{qw/USR1 USR2/} = mrecv sub { - print $wtr $_[0], "\n"; - close $wtr; - exit EXIT_SUCCESS; + exit(($msg eq $_[0]) ? EXIT_SUCCESS : EXIT_FAILURE); }; 1 while 1; + exit EXIT_FAILURE; } - close $wtr or die "$desc: close() failed : $!"; + my $next = 0; eval { local $SIG{ALRM} = sub { die 'timeout' }; my $a = (int(100 * (3 * $l) / $speed) || 1); $a = 10 if $a > 10; alarm $a; - msend $msg => $pid, $speed; + msend $msg => $pid, speed => $speed; waitpid $pid, 0; + if (WIFEXITED($?) && (WEXITSTATUS($?) == EXIT_SUCCESS)) { + ++$ok; + } else { + print STDERR " transfer error\n"; + $next = 1; + } }; alarm 0; if ($@) { kill SIGINT, $pid; kill SIGTERM, $pid; kill SIGKILL, $pid; - close $rdr or die "$desc: close() failed : $!"; print STDERR " timeout\n"; - next TRY; - } - my $recv = do { local $/; <$rdr> }; - close $rdr or die "$desc: close() failed : $!"; - if ($recv) { - chomp $recv; - if ($msg eq $recv) { - ++$ok; - } else { - print STDERR " transfer error\n"; - last TRY; - } - } else { - print STDERR " transfer failure\n"; - last TRY; + $next = 1; } + next SPEED if $next; } } - if ($speed) { + $desc = "$l bytes sent $n times"; + if ($speed >= 1) { print STDERR " OK\n\n"; - $desc = "$l bytes sent $n times"; push @res, "$desc at $speed bits/s"; + } else { + print STDERR " FAILED\n\n"; + push @res, "$desc FAILED"; } }