1b39c5158Smillertuse strict; 2b39c5158Smillertuse warnings; 3b39c5158Smillert 4b39c5158SmillertBEGIN { 5b39c5158Smillert use Config; 6b39c5158Smillert if (! $Config{'useithreads'}) { 7b39c5158Smillert print("1..0 # SKIP Perl not compiled with 'useithreads'\n"); 8b39c5158Smillert exit(0); 9b39c5158Smillert } 10b39c5158Smillert} 11b39c5158Smillert 12*256a93a4Safresh1my $frame_size; 13*256a93a4Safresh1my $frames; 14*256a93a4Safresh1my $size; 15*256a93a4Safresh1 16*256a93a4Safresh1BEGIN { 17*256a93a4Safresh1 # XXX Note that if the default stack size happens to be the same as these 18*256a93a4Safresh1 # numbers, that test 2 would return success just out of happenstance. 19*256a93a4Safresh1 # This possibility could be lessened by choosing $frames to be something 20*256a93a4Safresh1 # less likely than a power of 2 21*256a93a4Safresh1 $frame_size = 4096; 22*256a93a4Safresh1 $frames = 128; 23*256a93a4Safresh1 $size = $frames * $frame_size; 24*256a93a4Safresh1} 25*256a93a4Safresh1 26b39c5158Smillertuse ExtUtils::testlib; 27b39c5158Smillert 28b39c5158Smillertsub ok { 29b39c5158Smillert my ($id, $ok, $name) = @_; 30b39c5158Smillert 31b39c5158Smillert # You have to do it this way or VMS will get confused. 32b39c5158Smillert if ($ok) { 33b39c5158Smillert print("ok $id - $name\n"); 34b39c5158Smillert } else { 35b39c5158Smillert print("not ok $id - $name\n"); 36b39c5158Smillert printf("# Failed test at line %d\n", (caller)[2]); 37b39c5158Smillert } 38b39c5158Smillert 39b39c5158Smillert return ($ok); 40b39c5158Smillert} 41b39c5158Smillert 42*256a93a4Safresh1sub is { 43*256a93a4Safresh1 my ($id, $got, $expected, $name) = @_; 44*256a93a4Safresh1 45*256a93a4Safresh1 my $ok = ok($id, $got == $expected, $name); 46*256a93a4Safresh1 if (! $ok) { 47*256a93a4Safresh1 print(" GOT: $got\n"); 48*256a93a4Safresh1 print("EXPECTED: $expected\n"); 49*256a93a4Safresh1 } 50*256a93a4Safresh1 51*256a93a4Safresh1 return ($ok); 52*256a93a4Safresh1} 53*256a93a4Safresh1 54b39c5158SmillertBEGIN { 55b39c5158Smillert $| = 1; 56b39c5158Smillert print("1..18\n"); ### Number of tests that will be run ### 57b39c5158Smillert}; 58b39c5158Smillert 59*256a93a4Safresh1use threads ('stack_size' => $size); 60b39c5158Smillertok(1, 1, 'Loaded'); 61b39c5158Smillert 62b39c5158Smillert### Start of Testing ### 63b39c5158Smillert 64*256a93a4Safresh1my $actual_size = threads->get_stack_size(); 65*256a93a4Safresh1 66*256a93a4Safresh1{ 67*256a93a4Safresh1 if ($actual_size > $size) { 68*256a93a4Safresh1 print("ok 2 # skip because system needs larger minimum stack size\n"); 69*256a93a4Safresh1 $size = $actual_size; 70*256a93a4Safresh1 } 71*256a93a4Safresh1 else { 72*256a93a4Safresh1 is(2, $actual_size, $size, 'Stack size set in import'); 73*256a93a4Safresh1 } 74*256a93a4Safresh1} 75*256a93a4Safresh1 76*256a93a4Safresh1my $size_plus_quarter = $size * 1.25; # 128 frames map to 160 77*256a93a4Safresh1is(3, threads->set_stack_size($size_plus_quarter), $size, 78b39c5158Smillert 'Set returns previous value'); 79*256a93a4Safresh1is(4, threads->get_stack_size(), $size_plus_quarter, 80b39c5158Smillert 'Get stack size'); 81b39c5158Smillert 82b39c5158Smillertthreads->create( 83b39c5158Smillert sub { 84*256a93a4Safresh1 is(5, threads->get_stack_size(), $size_plus_quarter, 85b39c5158Smillert 'Get stack size in thread'); 86*256a93a4Safresh1 is(6, threads->self()->get_stack_size(), $size_plus_quarter, 87b39c5158Smillert 'Thread gets own stack size'); 88*256a93a4Safresh1 is(7, threads->set_stack_size($size), $size_plus_quarter, 89b39c5158Smillert 'Thread changes stack size'); 90*256a93a4Safresh1 is(8, threads->get_stack_size(), $size, 91b39c5158Smillert 'Get stack size in thread'); 92*256a93a4Safresh1 is(9, threads->self()->get_stack_size(), $size_plus_quarter, 93b39c5158Smillert 'Thread stack size unchanged'); 94b39c5158Smillert } 95b39c5158Smillert)->join(); 96b39c5158Smillert 97*256a93a4Safresh1is(10, threads->get_stack_size(), $size, 98b39c5158Smillert 'Default thread sized changed in thread'); 99b39c5158Smillert 100b39c5158Smillertthreads->create( 101*256a93a4Safresh1 { 'stack' => $size_plus_quarter }, 102b39c5158Smillert sub { 103*256a93a4Safresh1 is(11, threads->get_stack_size(), $size, 104b39c5158Smillert 'Get stack size in thread'); 105*256a93a4Safresh1 is(12, threads->self()->get_stack_size(), $size_plus_quarter, 106b39c5158Smillert 'Thread gets own stack size'); 107b39c5158Smillert } 108b39c5158Smillert)->join(); 109b39c5158Smillert 110*256a93a4Safresh1my $thr = threads->create( { 'stack' => $size_plus_quarter }, sub { } ); 111b39c5158Smillert 112b39c5158Smillert$thr->create( 113b39c5158Smillert sub { 114*256a93a4Safresh1 is(13, threads->get_stack_size(), $size, 115b39c5158Smillert 'Get stack size in thread'); 116*256a93a4Safresh1 is(14, threads->self()->get_stack_size(), $size_plus_quarter, 117b39c5158Smillert 'Thread gets own stack size'); 118b39c5158Smillert } 119b39c5158Smillert)->join(); 120b39c5158Smillert 121*256a93a4Safresh1my $size_plus_eighth = $size * 1.125; # 128 frames map to 144 122b39c5158Smillert$thr->create( 123*256a93a4Safresh1 { 'stack' => $size_plus_eighth }, 124b39c5158Smillert sub { 125*256a93a4Safresh1 is(15, threads->get_stack_size(), $size, 126b39c5158Smillert 'Get stack size in thread'); 127*256a93a4Safresh1 is(16, threads->self()->get_stack_size(), $size_plus_eighth, 128b39c5158Smillert 'Thread gets own stack size'); 129*256a93a4Safresh1 is(17, threads->set_stack_size($size_plus_quarter), $size, 130b39c5158Smillert 'Thread changes stack size'); 131b39c5158Smillert } 132b39c5158Smillert)->join(); 133b39c5158Smillert 134b39c5158Smillert$thr->join(); 135b39c5158Smillert 136*256a93a4Safresh1is(18, threads->get_stack_size(), $size_plus_quarter, 137b39c5158Smillert 'Default thread sized changed in thread'); 138b39c5158Smillert 139b39c5158Smillertexit(0); 140b39c5158Smillert 141b39c5158Smillert# EOF 142