/* This testcase is part of GDB, the GNU debugger. Copyright 2015-2019 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include /* Number of threads. */ #define NTHREADS 10 /* When set, threads exit. */ volatile int break_out; pthread_barrier_t barrier; /* Entry point for threads that setjmp/longjmp. */ static void * thread_longjmp (void *arg) { jmp_buf env; pthread_barrier_wait (&barrier); while (!break_out) { if (setjmp (env) == 0) longjmp (env, 1); usleep (1); } return NULL; } /* Entry point for threads that try/catch. */ static void * thread_try_catch (void *arg) { volatile unsigned int counter = 0; pthread_barrier_wait (&barrier); while (!break_out) { try { throw 1; } catch (...) { counter++; } usleep (1); } return NULL; } int main (void) { pthread_t threads[NTHREADS]; int i; int ret; /* Don't run forever. */ alarm (180); pthread_barrier_init (&barrier, NULL, NTHREADS + 1); for (i = 0; i < NTHREADS; i++) { /* Half of the threads does setjmp/longjmp, the other half does try/catch. */ if ((i % 2) == 0) ret = pthread_create (&threads[i], NULL, thread_longjmp , NULL); else ret = pthread_create (&threads[i], NULL, thread_try_catch , NULL); assert (ret == 0); } /* Wait until all threads are running. */ pthread_barrier_wait (&barrier); #define LINE usleep (1) /* The other thread's setjmp/longjmp/try/catch should not disturb this thread's stepping over these lines. */ LINE; /* set break here */ LINE; /* line 1 */ LINE; /* line 2 */ LINE; /* line 3 */ LINE; /* line 4 */ LINE; /* line 5 */ LINE; /* line 6 */ LINE; /* line 7 */ LINE; /* line 8 */ LINE; /* line 9 */ LINE; /* line 10 */ break_out = 1; for (i = 0; i < NTHREADS; i++) { ret = pthread_join (threads[i], NULL); assert (ret == 0); } return 0; }