xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.threads/reconnect-signal.c (revision 82d56013d7b633d116a93943de88e08335357a7c)
1 /* This testcase is part of GDB, the GNU debugger.
2 
3    Copyright 2013-2019 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 <pthread.h>
19 #include <signal.h>
20 #include <unistd.h>
21 
22 static pthread_t thread_2;
23 sig_atomic_t unlocked;
24 
25 /* The test has three threads, and it's always thread 2 that gets the
26    signal, to avoid spurious passes in case the remote side happens to
27    always pick the first or the last thread in the list as the
28    current/status thread on reconnection.  */
29 
30 static void *
31 start2 (void *arg)
32 {
33   unsigned int count;
34 
35   pthread_kill (thread_2, SIGUSR1);
36 
37   for (count = 1; !unlocked && count != 0; count++)
38     usleep (1);
39   return NULL;
40 }
41 
42 static void *
43 start (void *arg)
44 {
45   pthread_t thread;
46 
47   pthread_create (&thread, NULL, start2, NULL);
48   pthread_join (thread, NULL);
49   return NULL;
50 }
51 
52 void
53 handle (int sig)
54 {
55   unlocked = 1;
56 }
57 
58 int
59 main ()
60 {
61   signal (SIGUSR1, handle);
62 
63   pthread_create (&thread_2, NULL, start, NULL);
64   pthread_join (thread_2, NULL);
65 
66   return 0;
67 }
68