1 /* This testcase is part of GDB, the GNU debugger. 2 3 Copyright 2017-2020 Free Software Foundation, Inc. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program 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 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 18 #include <stdio.h> 19 #include <stdlib.h> 20 #include <string.h> 21 #include <sys/types.h> 22 #include <unistd.h> 23 #include <pthread.h> 24 #include <errno.h> 25 26 /* This barrier ensures we only reach the initial breakpoint after both threads 27 have set errno. */ 28 pthread_barrier_t start_threads_barrier; 29 30 static void 31 break_here (void) 32 { 33 } 34 35 static void * 36 thread_routine (void *arg) 37 { 38 errno = 42; 39 pthread_barrier_wait (&start_threads_barrier); 40 41 break_here (); 42 43 while (1) 44 sleep (1); 45 46 return NULL; 47 } 48 49 int 50 main (int argc, char *argv) 51 { 52 pthread_t the_thread; 53 int err; 54 55 pthread_barrier_init (&start_threads_barrier, NULL, 2); 56 57 err = pthread_create (&the_thread, NULL, thread_routine, NULL); 58 if (err != 0) 59 { 60 fprintf (stderr, "pthread_create: %s (%d)\n", strerror (err), err); 61 exit (EXIT_FAILURE); 62 } 63 64 errno = 23; 65 pthread_barrier_wait (&start_threads_barrier); 66 67 err = pthread_join (the_thread, NULL); 68 if (err != 0) 69 { 70 fprintf (stderr, "pthread_join: %s (%d)\n", strerror (err), err); 71 exit (EXIT_FAILURE); 72 } 73 74 exit (EXIT_SUCCESS); 75 } 76