X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FIPC-MorseSignals.git;a=blobdiff_plain;f=t%2Flib%2FIPCMTest.pm;h=6cd2f43f106827d1195b7b0ae949eceb3a3603db;hp=33d006ca54b1fe2d6c00a5235050f35106833e07;hb=f92bbcf77fb757c6655f4611c900c49ed178f27e;hpb=8a4a3ba553f81cfdb679c19363f514efb04f29c1 diff --git a/t/lib/IPCMTest.pm b/t/lib/IPCMTest.pm index 33d006c..6cd2f43 100644 --- a/t/lib/IPCMTest.pm +++ b/t/lib/IPCMTest.pm @@ -3,6 +3,7 @@ package IPCMTest; use strict; use warnings; +use Encode; use POSIX qw/SIGINT SIGTERM SIGKILL SIGHUP EXIT_FAILURE/; use IPC::MorseSignals qw/msend mrecv mreset/; @@ -11,9 +12,7 @@ use base qw/Exporter/; our @EXPORT_OK = qw/try speed init cleanup/; -our $lives = 10; - -my ($utf8, $pid, $rdr); +my ($lives, $pid, $rdr); sub spawn { --$lives; @@ -23,25 +22,24 @@ sub spawn { if (!defined $pid) { die "fork() failed: $!"; } elsif ($pid == 0) { + local %SIG; close $rdr or die "close() failed: $!"; - binmode $wtr, ':utf8' if $utf8; - my $block = 0; - my $rcv = mrecv local %SIG, cb => sub { - if ($block) { - $block = 0; - } else { - select $wtr; $| = 1; - print $wtr $_[0], ':', $_[1], "\n"; - select $wtr; $| = 1; - } + my $rcv = mrecv %SIG, cb => sub { + binmode $wtr, ':utf8' if Encode::is_utf8 $_[1]; + select $wtr; $| = 1; + print $wtr $_[0], ':', $_[1], "\n"; + select $wtr; $| = 1; }; $SIG{HUP} = sub { mreset $rcv }; - $SIG{__WARN__} = sub { $block = 1 }; + $SIG{__WARN__} = sub { + select $wtr; $| = 1; + print $wtr "__WARN__\n"; + select $wtr; $| = 1; + }; 1 while 1; exit EXIT_FAILURE; } close $wtr or die "close() failed: $!"; - binmode $rdr, ':utf8' if $utf8; } sub slaughter { @@ -52,7 +50,8 @@ sub slaughter { } sub init { - $utf8 = $_[0] || 0; + ($lives) = @_; + $lives ||= 10; spawn; } @@ -64,25 +63,24 @@ sub try { my $speed = 2 ** 16; my $ok = 0; my @ret; + binmode $rdr, ((Encode::is_utf8 $msg) ? ':utf8' : ':crlf'); while (!$ok && (($speed /= 2) >= 1)) { my $r = ''; eval { local $SIG{ALRM} = sub { die 'timeout' }; - local $SIG{__WARN__} = sub { die 'do not want warnings' }; + local $SIG{__WARN__} = sub { alarm 0; die 'do not want warnings' }; my $a = (int(100 * (3 * length $msg) / $speed) || 1); $a = 10 if $a > 10; alarm $a; kill SIGHUP => $pid; - msend $msg => $pid, speed => $speed, utf8 => $utf8, sign => $sign; + msend $msg => $pid, speed => $speed, sign => $sign; $r = <$rdr>; + alarm 0; }; - kill SIGHUP => $pid if $@; - alarm 0; if (!defined $r) { # Something bad happened, respawn close $rdr or die "close() failed: $!"; slaughter; spawn; - $speed *= 2; # Retry this speed } else { chomp $r; if ($r eq ((($sign) ? $$ : 0) . ':' . $msg)) { @@ -103,6 +101,7 @@ sub speed { my $msg = join '', map { $alpha[rand @alpha] } 1 .. $l; my $desc_base = "$l bytes sent $n times"; while (($ok < $n) && (($speed /= 2) >= 1)) { + $ok = 0; my $desc = "$desc_base at $speed bits/s"; $diag->("try $desc..."); TRY: @@ -110,21 +109,20 @@ TRY: my $r = ''; eval { local $SIG{ALRM} = sub { die 'timeout' }; - local $SIG{__WARN__} = sub { die 'do not want warnings' }; + local $SIG{__WARN__} = sub { alarm 0; die 'do not want warnings' }; my $a = (int(100 * (3 * $l) / $speed) || 1); $a = 10 if $a > 10; alarm $a; kill SIGHUP => $pid; - msend $msg => $pid, speed => $speed, utf8 => $utf8, sign => 0; + msend $msg => $pid, speed => $speed, sign => 0; $r = <$rdr>; + alarm 0; }; - kill SIGHUP => $pid if $@; - alarm 0; if (!defined $r) { # Something bad happened, respawn close $rdr or die "close() failed: $!"; slaughter; spawn; - redo TRY; # Retry this send + last TRY; } else { chomp $r; if ($r eq '0:' . $msg) {