1*5759b3d2Safresh1#!perl 2*5759b3d2Safresh1BEGIN { 3*5759b3d2Safresh1 require Config; 4*5759b3d2Safresh1 unless ($Config::Config{'usethreads'}) { 5*5759b3d2Safresh1 print "1..0 # Skip -- need threads for this test\n"; 6*5759b3d2Safresh1 exit 0; 7*5759b3d2Safresh1 } 8*5759b3d2Safresh1 if (($Config::Config{'extensions'} !~ m!\bPerlIO/via\b!) ){ 9*5759b3d2Safresh1 print "1..0 # Skip -- Perl configured without PerlIO::via module\n"; 10*5759b3d2Safresh1 exit 0; 11*5759b3d2Safresh1 } 12*5759b3d2Safresh1} 13*5759b3d2Safresh1 14*5759b3d2Safresh1use strict; 15*5759b3d2Safresh1use warnings; 16*5759b3d2Safresh1use threads; 17*5759b3d2Safresh1 18*5759b3d2Safresh1my $tmp = "via$$"; 19*5759b3d2Safresh1 20*5759b3d2Safresh1END { 21*5759b3d2Safresh1 1 while unlink $tmp; 22*5759b3d2Safresh1} 23*5759b3d2Safresh1 24*5759b3d2Safresh1use Test::More tests => 2; 25*5759b3d2Safresh1 26*5759b3d2Safresh1our $push_count = 0; 27*5759b3d2Safresh1 28*5759b3d2Safresh1{ 29*5759b3d2Safresh1 open my $fh, ">:via(Test1)", $tmp 30*5759b3d2Safresh1 or die "Cannot open $tmp: $!"; 31*5759b3d2Safresh1 $fh->autoflush; 32*5759b3d2Safresh1 33*5759b3d2Safresh1 print $fh "AXAX"; 34*5759b3d2Safresh1 35*5759b3d2Safresh1 # previously this would crash 36*5759b3d2Safresh1 threads->create( 37*5759b3d2Safresh1 sub { 38*5759b3d2Safresh1 print $fh "XZXZ"; 39*5759b3d2Safresh1 })->join; 40*5759b3d2Safresh1 41*5759b3d2Safresh1 print $fh "BXBX"; 42*5759b3d2Safresh1 close $fh; 43*5759b3d2Safresh1 44*5759b3d2Safresh1 open my $in, "<", $tmp; 45*5759b3d2Safresh1 my $line = <$in>; 46*5759b3d2Safresh1 close $in; 47*5759b3d2Safresh1 48*5759b3d2Safresh1 is($line, "AYAYYZYZBYBY", "check thread data delivered"); 49*5759b3d2Safresh1 50*5759b3d2Safresh1 is($push_count, 1, "PUSHED not called for dup on thread creation"); 51*5759b3d2Safresh1} 52*5759b3d2Safresh1 53*5759b3d2Safresh1package PerlIO::via::Test1; 54*5759b3d2Safresh1 55*5759b3d2Safresh1sub PUSHED { 56*5759b3d2Safresh1 my ($class) = @_; 57*5759b3d2Safresh1 ++$main::push_count; 58*5759b3d2Safresh1 bless {}, $class; 59*5759b3d2Safresh1} 60*5759b3d2Safresh1 61*5759b3d2Safresh1sub WRITE { 62*5759b3d2Safresh1 my ($self, $data, $fh) = @_; 63*5759b3d2Safresh1 $data =~ tr/X/Y/; 64*5759b3d2Safresh1 $fh->autoflush; 65*5759b3d2Safresh1 print $fh $data; 66*5759b3d2Safresh1 return length $data; 67*5759b3d2Safresh1} 68*5759b3d2Safresh1 69*5759b3d2Safresh1 70