xref: /openbsd-src/gnu/usr.bin/perl/dist/threads/t/stack.t (revision 256a93a44f36679bee503f12e49566c2183f6181)
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