X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=t%2F09-load-threads.t;h=10aef241624ca3cd3e84706d9494d4bb2e313357;hb=e86e8208c52e0d6cb0e040132025db13d6ea78f8;hp=b63a51eb8607fec625bd85849b4c43cd6eb2aeff;hpb=393fc036f99c98cdf1ac25b9f564e1d4c020bbc8;p=perl%2Fmodules%2FScope-Upper.git diff --git a/t/09-load-threads.t b/t/09-load-threads.t index b63a51e..10aef24 100644 --- a/t/09-load-threads.t +++ b/t/09-load-threads.t @@ -38,12 +38,14 @@ BEGIN { if (defined $thread_safe_var) { my $stat = run_perl "require POSIX; require $module; exit($thread_safe_var ? POSIX::EXIT_SUCCESS() : POSIX::EXIT_FAILURE())"; - require POSIX; - my $res = $stat >> 8; - if ($res == POSIX::EXIT_SUCCESS()) { - $is_threadsafe = 1; - } elsif ($res == POSIX::EXIT_FAILURE()) { - $is_threadsafe = !1; + if (defined $stat) { + require POSIX; + my $res = $stat >> 8; + if ($res == POSIX::EXIT_SUCCESS()) { + $is_threadsafe = 1; + } elsif ($res == POSIX::EXIT_FAILURE()) { + $is_threadsafe = !1; + } } if (not defined $is_threadsafe) { skip_all "Could not detect if $module is thread safe or not"; @@ -55,7 +57,9 @@ BEGIN { ) } -use Test::Leaner tests => 1 + (2 + 2 * 2) + 6 + (1 + 2 * 4); +my $could_not_create_thread = 'Could not create thread'; + +use Test::Leaner tests => 1 + (2 + 2 * 2) + 6 + (2 * 4) + 2; sub is_loaded { my ($affirmative, $desc) = @_; @@ -80,72 +84,88 @@ is_loaded 0, 'main body, beginning'; # Test serial loadings -my $thr = spawn(sub { - my $here = "first serial thread"; - is_loaded 0, "$here, beginning"; +SKIP: { + my $thr = spawn(sub { + my $here = "first serial thread"; + is_loaded 0, "$here, beginning"; - do_load; - is_loaded 1, "$here, after loading"; + do_load; + is_loaded 1, "$here, after loading"; - return; -}); + return; + }); -$thr->join; -if (my $err = $thr->error) { - die $err; + skip "$could_not_create_thread (serial 1)" => 2 unless defined $thr; + + $thr->join; + if (my $err = $thr->error) { + die $err; + } } is_loaded 0, 'main body, in between serial loadings'; -$thr = spawn(sub { - my $here = "second serial thread"; - is_loaded 0, "$here, beginning"; +SKIP: { + my $thr = spawn(sub { + my $here = "second serial thread"; + is_loaded 0, "$here, beginning"; + + do_load; + is_loaded 1, "$here, after loading"; - do_load; - is_loaded 1, "$here, after loading"; + return; + }); - return; -}); + skip "$could_not_create_thread (serial 2)" => 2 unless defined $thr; -$thr->join; -if (my $err = $thr->error) { - die $err; + $thr->join; + if (my $err = $thr->error) { + die $err; + } } is_loaded 0, 'main body, after serial loadings'; # Test nested loadings -$thr = spawn(sub { - my $here = 'parent thread'; - is_loaded 0, "$here, beginning"; - - my $kid = spawn(sub { - my $here = 'child thread'; +SKIP: { + my $thr = spawn(sub { + my $here = 'parent thread'; is_loaded 0, "$here, beginning"; + SKIP: { + my $kid = spawn(sub { + my $here = 'child thread'; + is_loaded 0, "$here, beginning"; + + do_load; + is_loaded 1, "$here, after loading"; + + return; + }); + + skip "$could_not_create_thread (nested child)" => 2 unless defined $kid; + + $kid->join; + if (my $err = $kid->error) { + die "in child thread: $err\n"; + } + } + + is_loaded 0, "$here, after child terminated"; + do_load; is_loaded 1, "$here, after loading"; return; }); - $kid->join; - if (my $err = $kid->error) { - die "in child thread: $err\n"; - } - - is_loaded 0, "$here, after child terminated"; + skip "$could_not_create_thread (nested parent)" => (3 + 2) unless defined $thr; - do_load; - is_loaded 1, "$here, after loading"; - - return; -}); - -$thr->join; -if (my $err = $thr->error) { - die $err; + $thr->join; + if (my $err = $thr->error) { + die $err; + } } is_loaded 0, 'main body, after nested loadings'; @@ -177,54 +197,63 @@ sub sync_slave { } } -my $thr1 = spawn(sub { - my $here = 'first simultaneous thread'; - is_loaded 0, "$here, beginning"; - sync_slave 0; +SKIP: { + my $thr1 = spawn(sub { + my $here = 'first simultaneous thread'; + is_loaded 0, "$here, beginning"; + sync_slave 0; + + do_load; + is_loaded 1, "$here, after loading"; + sync_slave 1; + sync_slave 2; + + sync_slave 3; + is_loaded 1, "$here, still loaded while also loaded in the other thread"; + sync_slave 4; - do_load; - is_loaded 1, "$here, after loading"; - sync_slave 1; - sync_slave 2; + is_loaded 1, "$here, end"; - sync_slave 3; - is_loaded 1, "$here, still loaded while also loaded in the other thread"; - sync_slave 4; + return; + }); - is_loaded 1, "$here, end"; + skip "$could_not_create_thread (parallel 1)" => (4 * 2) unless defined $thr1; - return; -}); + my $thr2 = spawn(sub { + my $here = 'second simultaneous thread'; + is_loaded 0, "$here, beginning"; + sync_slave 0; -my $thr2 = spawn(sub { - my $here = 'second simultaneous thread'; - is_loaded 0, "$here, beginning"; - sync_slave 0; + sync_slave 1; + is_loaded 0, "$here, loaded in other thread but not here"; + sync_slave 2; - sync_slave 1; - is_loaded 0, "$here, loaded in other thread but not here"; - sync_slave 2; + do_load; + is_loaded 1, "$here, after loading"; + sync_slave 3; + sync_slave 4; - do_load; - is_loaded 1, "$here, after loading"; - sync_slave 3; - sync_slave 4; + is_loaded 1, "$here, end"; - is_loaded 1, "$here, end"; + return; + }); - return; -}); + sync_master($_) for 0 .. $#locks; -sync_master($_) for 0 .. $#locks; + $thr1->join; + if (my $err = $thr1->error) { + die $err; + } -$thr1->join; -if (my $err = $thr1->error) { - die $err; -} + skip "$could_not_create_thread (parallel 2)" => (4 * 1) unless defined $thr2; -$thr2->join; -if (my $err = $thr2->error) { - die $err; + $thr2->join; + if (my $err = $thr2->error) { + die $err; + } } is_loaded 0, 'main body, after simultaneous threads'; + +do_load; +is_loaded 1, 'main body, loaded at end';