1 /* Copyright (C) 2004-2022 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3 
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8 
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <https://www.gnu.org/licenses/>.  */
17 
18 #include <execinfo.h>
19 #include <pthread.h>
20 #include <stdio.h>
21 
22 #define BT_SIZE 64
23 void *bt_array[BT_SIZE];
24 int bt_cnt;
25 
26 int
do_bt(void)27 do_bt (void)
28 {
29   bt_cnt = backtrace (bt_array, BT_SIZE);
30   return 56;
31 }
32 
33 int
call_do_bt(void)34 call_do_bt (void)
35 {
36   return do_bt () + 1;
37 }
38 
39 void *
tf(void * arg)40 tf (void *arg)
41 {
42   if (call_do_bt () != 57)
43     return (void *) 1L;
44   return NULL;
45 }
46 
47 int
do_test(void)48 do_test (void)
49 {
50   pthread_t th;
51   if (pthread_create (&th, NULL, tf, NULL))
52     {
53       puts ("create failed");
54       return 1;
55     }
56 
57   void *res;
58   if (pthread_join (th, &res))
59     {
60       puts ("join failed");
61       return 1;
62     }
63 
64   if (res != NULL)
65     {
66       puts ("thread failed");
67       return 1;
68     }
69 
70   char **text = backtrace_symbols (bt_array, bt_cnt);
71   if (text == NULL)
72     {
73       puts ("backtrace_symbols failed");
74       return 1;
75     }
76 
77   for (int i = 0; i < bt_cnt; ++i)
78     puts (text[i]);
79 
80   return 0;
81 }
82 
83 #define TEST_FUNCTION do_test ()
84 #include "../test-skeleton.c"
85