iconv: Suppress array out of bounds warning.
[platform/upstream/glibc.git] / nptl / tst-tls1.c
1 /* Copyright (C) 2003-2015 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
18
19 #include <pthread.h>
20 #include <stdio.h>
21 #include <stdlib.h>
22
23
24 struct test_s
25 {
26   int a;
27   int b;
28 };
29
30 #define INIT_A 1
31 #define INIT_B 42
32 /* Deliberately not static.  */
33 __thread struct test_s s __attribute__ ((tls_model ("initial-exec"))) =
34 {
35   .a = INIT_A,
36   .b = INIT_B
37 };
38
39
40 static void *
41 tf (void *arg)
42 {
43   if (s.a != INIT_A || s.b != INIT_B)
44     {
45       puts ("initial value of s in child thread wrong");
46       exit (1);
47     }
48
49   ++s.a;
50
51   return NULL;
52 }
53
54
55 int
56 do_test (void)
57 {
58   if (s.a != INIT_A || s.b != INIT_B)
59     {
60       puts ("initial value of s in main thread wrong");
61       exit (1);
62     }
63
64   pthread_attr_t a;
65
66   if (pthread_attr_init (&a) != 0)
67     {
68       puts ("attr_init failed");
69       exit (1);
70     }
71
72   if (pthread_attr_setstacksize (&a, 1 * 1024 * 1024) != 0)
73     {
74       puts ("attr_setstacksize failed");
75       return 1;
76     }
77
78 #define N 10
79   int i;
80   for (i = 0; i < N; ++i)
81     {
82 #define M 10
83       pthread_t th[M];
84       int j;
85       for (j = 0; j < M; ++j, ++s.a)
86         if (pthread_create (&th[j], &a, tf, NULL) != 0)
87           {
88             puts ("pthread_create failed");
89             exit (1);
90           }
91
92       for (j = 0; j < M; ++j)
93         if (pthread_join (th[j], NULL) != 0)
94           {
95             puts ("pthread_join failed");
96             exit (1);
97           }
98     }
99
100   if (pthread_attr_destroy (&a) != 0)
101     {
102       puts ("attr_destroy failed");
103       exit (1);
104     }
105
106   return 0;
107 }
108
109
110 #define TEST_FUNCTION do_test ()
111 #include "../test-skeleton.c"