⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 problems.t

📁 source of perl for linux application,
💻 T
字号:
use strict;use warnings;BEGIN {    if ($ENV{'PERL_CORE'}){        chdir 't';        unshift @INC, '../lib';    }    use Config;    if (! $Config{'useithreads'}) {        print("1..0 # Skip: Perl not compiled with 'useithreads'\n");        exit(0);    }}use ExtUtils::testlib;use threads;BEGIN {    eval {        require threads::shared;        threads::shared->import();    };    if ($@ || ! $threads::shared::threads_shared) {        print("1..0 # Skip: threads::shared not available\n");        exit(0);    }    $| = 1;    if ($] == 5.008) {        print("1..11\n");   ### Number of tests that will be run ###    } else {        print("1..15\n");   ### Number of tests that will be run ###    }};print("ok 1 - Loaded\n");### Start of Testing ###no warnings 'deprecated';       # Suppress warnings related to :uniqueuse Hash::Util 'lock_keys';my $test :shared = 2;# Note that we can't use Test::More here, as we would need to call is()# from within the DESTROY() function at global destruction time, and# parts of Test::* may have already been freed by thensub is($$$){    my ($got, $want, $desc) = @_;    lock($test);    if ($got ne $want) {        print("# EXPECTED: $want\n");        print("# GOT:      $got\n");        print("not ");    }    print("ok $test - $desc\n");    $test++;}# This tests for too much destruction which was caused by cloning stashes# on join which led to double the dataspace under 5.8.0if ($] != 5.008){    sub Foo::DESTROY    {        my $self = shift;        my ($package, $file, $line) = caller;        is(threads->tid(), $self->{tid}, "In destroy[$self->{tid}] it should be correct too" );    }    my $foo = bless {tid => 0}, 'Foo';    my $bar = threads->create(sub {        is(threads->tid(), 1, "And tid be 1 here");        $foo->{tid} = 1;        return ($foo);    })->join();    $bar->{tid} = 0;}# This tests whether we can call Config::myconfig after threads have been# started (interpreter cloned).  5.8.1 and 5.8.2 contained a bug that would# disallow that to be done because an attempt was made to change a variable# with the :unique attribute.{    lock($test);    if ($] == 5.008 || $] >= 5.008003) {        threads->create( sub {1} )->join;        my $not = eval { Config::myconfig() } ? '' : 'not ';        print "${not}ok $test - Are we able to call Config::myconfig after clone\n";    } else {        print "ok $test # Skip Are we able to call Config::myconfig after clone\n";    }    $test++;}# bugid 24383 - :unique hashes weren't being made readonly on interpreter# clone; check that they are.our $unique_scalar : unique;our @unique_array : unique;our %unique_hash : unique;threads->create(sub {        lock($test);        my $TODO = ":unique needs to be re-implemented in a non-broken way";        eval { $unique_scalar = 1 };        print $@ =~ /read-only/          ? '' : 'not ', "ok $test # TODO $TODO - unique_scalar\n";        $test++;        eval { $unique_array[0] = 1 };        print $@ =~ /read-only/          ? '' : 'not ', "ok $test # TODO $TODO - unique_array\n";        $test++;        if ($] >= 5.008003 && $^O ne 'MSWin32') {            eval { $unique_hash{abc} = 1 };            print $@ =~ /disallowed/              ? '' : 'not ', "ok $test # TODO $TODO - unique_hash\n";        } else {            print("ok $test # Skip $TODO - unique_hash\n");        }        $test++;    })->join;# bugid #24940 :unique should fail on my and sub declarationsfor my $decl ('my $x : unique', 'sub foo : unique') {    {        lock($test);        if ($] >= 5.008005) {            eval $decl;            print $@ =~ /^The 'unique' attribute may only be applied to 'our' variables/                    ? '' : 'not ', "ok $test - $decl\n";        } else {            print("ok $test # Skip $decl\n");        }        $test++;    }}# Returing a closure from a thread caused problems. If the last index in# the anon sub's pad wasn't for a lexical, then a core dump could occur.# Otherwise, there might be leaked scalars.# XXX DAPM 9-Jan-04 - backed this out for now - returning a closure from a# thread seems to crash win32# sub f {#     my $x = "foo";#     sub { $x."bar" };# }# # my $string = threads->create(\&f)->join->();# print $string eq 'foobar' ?  '' : 'not ', "ok $test - returning closure\n";# $test++;# Nothing is checking that total keys gets cloned correctly.my %h = (1,2,3,4);is(keys(%h), 2, "keys correct in parent");my $child = threads->create(sub { return (scalar(keys(%h))); })->join;is($child, 2, "keys correct in child");lock_keys(%h);delete($h{1});is(keys(%h), 1, "keys correct in parent with restricted hash");$child = threads->create(sub { return (scalar(keys(%h))); })->join;is($child, 1, "keys correct in child with restricted hash");# EOF

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -