xref: /openbsd-src/gnu/usr.bin/perl/ext/PerlIO-via/t/thread.t (revision 256a93a44f36679bee503f12e49566c2183f6181)
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