The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!./perl

BEGIN {
    chdir 't' if -d 't';
    @INC = '../lib';
    require Config; import Config;
    if ($Config{'extensions'} !~ /\bFile\/Glob\b/i) {
        print "1..0\n";
        exit 0;
    }
}
use strict;
use warnings;
# Test::More needs threads pre-loaded
use if $Config{useithreads}, 'threads';
use Test::More;

BEGIN {
    if (! $Config{'useithreads'}) {
        plan skip_all => "Perl not compiled with 'useithreads'";
    }
}

use File::Temp qw(tempdir);
use File::Spec qw();
use File::Glob qw(csh_glob);

my($dir) = tempdir(CLEANUP => 1)
    or die "Could not create temporary directory";

my @temp_files = qw(1_file.tmp 2_file.tmp 3_file.tmp);
for my $file (@temp_files) {
    open my $fh, ">", File::Spec->catfile($dir, $file)
        or die "Could not create file $dir/$file: $!";
    close $fh;
}
my $cwd = Cwd::cwd();
chdir $dir
    or die "Could not chdir to $dir: $!";

sub do_glob { scalar csh_glob("*") }
# Stablish some glob state
my $first_file = do_glob();
is($first_file, $temp_files[0]);

my @files;
push @files, threads->create(\&do_glob)->join() for 1..5;
is_deeply(
    \@files,
    [($temp_files[1]) x 5],
    "glob() state is cloned for new threads"
);

@files = threads->create({'context' => 'list'},
    sub {
        return do_glob(), threads->create(\&do_glob)->join()
    })->join();

is_deeply(
    \@files,
    [@temp_files[1,2]],
    "..and for new threads inside threads"
);

my $second_file = do_glob();
is($second_file, $temp_files[1], "state doesn't leak from threads");

chdir $cwd
    or die "Could not chdir back to $cwd: $!";

done_testing;