Commit | Line | Data |
---|---|---|
f0fd9238 AC |
1 | /* This testcase is part of GDB, the GNU debugger. |
2 | ||
618f726f | 3 | Copyright 2004-2016 Free Software Foundation, Inc. |
f0fd9238 AC |
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 | |
a9762ec7 | 7 | the Free Software Foundation; either version 3 of the License, or |
f0fd9238 AC |
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. | |
a9762ec7 | 14 | |
f0fd9238 | 15 | You should have received a copy of the GNU General Public License |
a9762ec7 | 16 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
f0fd9238 AC |
17 | |
18 | */ | |
19 | ||
20 | #include <stdio.h> | |
e425eb2b | 21 | #include <string.h> |
f0fd9238 AC |
22 | #include <signal.h> |
23 | #include <sys/time.h> | |
501b79c1 | 24 | #include <errno.h> |
f0fd9238 AC |
25 | |
26 | static volatile int done; | |
e5f8a7cc | 27 | static volatile int dummy; |
7f5ef605 | 28 | static volatile int no_handler; |
f0fd9238 AC |
29 | |
30 | static void | |
31 | handler (int sig) | |
32 | { | |
abbdbd03 PA |
33 | /* This is more than one write so that the breakpoint location below |
34 | is more than one instruction away. */ | |
f0fd9238 | 35 | done = 1; |
abbdbd03 PA |
36 | done = 1; |
37 | done = 1; | |
38 | done = 1; /* other handler location */ | |
f0fd9238 AC |
39 | } /* handler */ |
40 | ||
b04e311d AC |
41 | struct itimerval itime; |
42 | struct sigaction action; | |
43 | ||
44 | /* The enum is so that GDB can easily see these macro values. */ | |
45 | enum { | |
46 | itimer_real = ITIMER_REAL, | |
47 | itimer_virtual = ITIMER_VIRTUAL | |
48 | } itimer = ITIMER_VIRTUAL; | |
49 | ||
501b79c1 | 50 | int |
f0fd9238 AC |
51 | main () |
52 | { | |
501b79c1 | 53 | int res; |
7f5ef605 | 54 | |
f0fd9238 | 55 | /* Set up the signal handler. */ |
b04e311d | 56 | memset (&action, 0, sizeof (action)); |
7f5ef605 | 57 | action.sa_handler = no_handler ? SIG_IGN : handler; |
b04e311d AC |
58 | sigaction (SIGVTALRM, &action, NULL); |
59 | sigaction (SIGALRM, &action, NULL); | |
60 | ||
61 | /* The values needed for the itimer. This needs to be at least long | |
62 | enough for the setitimer() call to return. */ | |
63 | memset (&itime, 0, sizeof (itime)); | |
64 | itime.it_value.tv_usec = 250 * 1000; | |
65 | ||
66 | /* Loop for ever, constantly taking an interrupt. */ | |
67 | while (1) | |
68 | { | |
69 | /* Set up a one-off timer. A timer, rather than SIGSEGV, is | |
70 | used as after a timer handler finishes the interrupted code | |
71 | can safely resume. */ | |
501b79c1 PM |
72 | res = setitimer (itimer, &itime, NULL); |
73 | if (res == -1) | |
74 | { | |
75 | printf ("First call to setitimer failed, errno = %d\r\n",errno); | |
76 | itimer = ITIMER_REAL; | |
77 | res = setitimer (itimer, &itime, NULL); | |
78 | if (res == -1) | |
79 | { | |
80 | printf ("Second call to setitimer failed, errno = %d\r\n",errno); | |
81 | return 1; | |
82 | } | |
83 | } | |
e5f8a7cc PA |
84 | /* Wait. Issue a couple writes to a dummy volatile var to be |
85 | reasonably sure our simple "get-next-pc" logic doesn't | |
86 | stumble on branches. */ | |
87 | dummy = 0; dummy = 0; while (!done); | |
b04e311d AC |
88 | done = 0; |
89 | } | |
501b79c1 | 90 | return 0; |
b04e311d | 91 | } |