diff options
Diffstat (limited to 'gdb/testsuite')
-rw-r--r-- | gdb/testsuite/ChangeLog | 13 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/no-unwaited-for-left.c | 68 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/no-unwaited-for-left.exp | 69 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/non-ldr-exc-1.c | 61 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/non-ldr-exc-1.exp | 65 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/non-ldr-exc-2.c | 70 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/non-ldr-exc-2.exp | 70 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/non-ldr-exc-3.c | 100 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/non-ldr-exc-3.exp | 68 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/non-ldr-exc-4.c | 92 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/non-ldr-exc-4.exp | 67 |
11 files changed, 743 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index f26044b..479676a 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,16 @@ +2011-10-28 Pedro Alves <pedro@codesourcery.com> + + * gdb.threads/no-unwaited-for-left.c: New. + * gdb.threads/no-unwaited-for-left.exp: New. + * gdb.threads/non-ldr-exc-1.c: New. + * gdb.threads/non-ldr-exc-1.exp: New. + * gdb.threads/non-ldr-exc-2.c: New. + * gdb.threads/non-ldr-exc-2.exp: New. + * gdb.threads/non-ldr-exc-3.c: New. + * gdb.threads/non-ldr-exc-3.exp: New. + * gdb.threads/non-ldr-exc-4.c: New. + * gdb.threads/non-ldr-exc-4.exp: New. + 2011-10-28 Jan Kratochvil <jan.kratochvil@redhat.com> * gdb.base/async-shell.exp: Skip the testfile for use_gdb_stub. diff --git a/gdb/testsuite/gdb.threads/no-unwaited-for-left.c b/gdb/testsuite/gdb.threads/no-unwaited-for-left.c new file mode 100644 index 0000000..d8c32cf --- /dev/null +++ b/gdb/testsuite/gdb.threads/no-unwaited-for-left.c @@ -0,0 +1,68 @@ +/* Copyright 2007, 2011 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 <http://www.gnu.org/licenses/>. */ + +#include <pthread.h> +#include <assert.h> +#include <unistd.h> + +static volatile pthread_t main_thread; +pthread_barrier_t barrier; + +static void * +thread_a (void *arg) +{ + int i; + + return 0; /* break-here */ +} + +static void * +thread_b (void *arg) +{ + int i; + + pthread_barrier_wait (&barrier); + + i = pthread_join (main_thread, NULL); + assert (i == 0); + + return arg; +} + +int +main (void) +{ + pthread_t thread; + int i; + + /* First test resuming only `thread_a', which exits. */ + i = pthread_create (&thread, NULL, thread_a, NULL); + assert (i == 0); + pthread_join (thread, NULL); + + /* Then test resuming only the leader, which also exits. */ + main_thread = pthread_self (); + + pthread_barrier_init (&barrier, NULL, 2); + + i = pthread_create (&thread, NULL, thread_b, NULL); + assert (i == 0); + + pthread_barrier_wait (&barrier); + + pthread_exit (NULL); /* break-here-2 */ + /* NOTREACHED */ + return 0; +} diff --git a/gdb/testsuite/gdb.threads/no-unwaited-for-left.exp b/gdb/testsuite/gdb.threads/no-unwaited-for-left.exp new file mode 100644 index 0000000..ed991de --- /dev/null +++ b/gdb/testsuite/gdb.threads/no-unwaited-for-left.exp @@ -0,0 +1,69 @@ +# Copyright (C) 2007, 2011 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 <http://www.gnu.org/licenses/>. + +# Exit of a thread when there are other threads in the inferior should +# not hang GDB. + +set testfile "no-unwaited-for-left" +set srcfile ${testfile}.c +set executable ${testfile} +set binfile ${objdir}/${subdir}/${executable} + +if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + return -1 +} + +clean_restart ${executable} + +if ![runto_main] { + return -1 +} + +gdb_breakpoint $srcfile:[gdb_get_line_number "break-here"] +gdb_continue_to_breakpoint "break-here" ".* break-here .*" + +# Resume only the second thread +gdb_test_no_output "set scheduler-locking on" \ + "enable scheduler-locking, for thread 2" + +# Continue. Thread 2 exits, and the main thread was already stopped. +gdb_test "continue" \ + "No unwaited-for children left." \ + "continue stops when thread 2 exits" + +gdb_test "info threads" \ + "\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n *1 *Thread \[^\r\n\]* \[^\r\n\]*.*The current thread <Thread ID 2> has terminated.*" \ + "only main thread left, thread 2 terminated" + +# Select the main thread, let the third thread start, and stop at the +# main thread breakpoint. +gdb_test "thread 1" "" "select main thread" +gdb_test_no_output "set scheduler-locking off" \ + "disable scheduler-locking, letting new thread start" + +gdb_breakpoint [gdb_get_line_number "break-here-2"] +gdb_continue_to_breakpoint "break-here-2" ".* break-here-2 .*" + +# Let the main thread continue alone. +gdb_test_no_output "set scheduler-locking on" \ + "enable scheduler-locking, for main thread" +# The main thread exits, and thread 3 was already stopped. +gdb_test "continue" \ + "No unwaited-for children left." \ + "continue stops when the main thread exits" + +gdb_test "info threads" \ + "\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n *3 *Thread \[^\r\n\]* \[^\r\n\]*.*The current thread <Thread ID 1> has terminated.*" \ + "only thread 3 left, main thread terminated" diff --git a/gdb/testsuite/gdb.threads/non-ldr-exc-1.c b/gdb/testsuite/gdb.threads/non-ldr-exc-1.c new file mode 100644 index 0000000..04b98e9 --- /dev/null +++ b/gdb/testsuite/gdb.threads/non-ldr-exc-1.c @@ -0,0 +1,61 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2009, 2010, 2011 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 <http://www.gnu.org/licenses/>. */ + +#include <pthread.h> +#include <unistd.h> +#include <stdlib.h> +#include <assert.h> + +static const char *image; +static char *argv1 = "go away"; + +static void * +thread_execler (void *arg) +{ + /* Exec ourselves again. */ + if (execl (image, image, argv1, NULL) == -1) /* break-here */ + { + perror ("execl"); + abort (); + } + + return NULL; +} + +int +main (int argc, char **argv) +{ + pthread_t thread; + int i; + + image = argv[0]; + + /* Pass "inf" as argument to keep re-execing ad infinitum, which can + be useful for manual testing. Passing any other argument exits + immediately (and that's what the execl above does by + default). */ + if (argc == 2 && strcmp (argv[1], "inf") == 0) + argv1 = argv[1]; + else if (argc > 1) + exit (0); + + i = pthread_create (&thread, NULL, thread_execler, NULL); + assert (i == 0); + pthread_join (thread, NULL); + + return 0; +} diff --git a/gdb/testsuite/gdb.threads/non-ldr-exc-1.exp b/gdb/testsuite/gdb.threads/non-ldr-exc-1.exp new file mode 100644 index 0000000..edfda33 --- /dev/null +++ b/gdb/testsuite/gdb.threads/non-ldr-exc-1.exp @@ -0,0 +1,65 @@ +# Copyright 2009, 2010, 2011 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 <http://www.gnu.org/licenses/>. + +# Test that when a thread other than the main thread execs, we follow +# through to the new incarnation of the main thread. + +# No exec event support in the remote protocol. +if { [is_remote target] } then { + continue +} + +set testfile "non-ldr-exc-1" +set srcfile ${testfile}.c +set executable ${testfile} +set binfile ${objdir}/${subdir}/${executable} + +if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + return -1 +} + +proc do_test { lock_sched } { + global pf_prefix + global executable + + set save_pf_prefix $pf_prefix + lappend pf_prefix "lock-sched$lock_sched:" + + clean_restart ${executable} + + if ![runto_main] { + set pf_prefix $save_pf_prefix + return -1 + } + + gdb_breakpoint [gdb_get_line_number "break-here"] + gdb_continue_to_breakpoint "break-here" ".* break-here .*" + + # Also test with sched-lock to make sure we can follow the + # non-leader thread execing even though the main thread wasn't + # resumed before the exec. + if { $lock_sched } { + gdb_test_no_output "set scheduler-locking on" + } + + gdb_test "continue" \ + ".*is executing new program.*Breakpoint 1, main.* at .*" \ + "continue over exec" + + set pf_prefix $save_pf_prefix +} + +do_test 0 +do_test 1 diff --git a/gdb/testsuite/gdb.threads/non-ldr-exc-2.c b/gdb/testsuite/gdb.threads/non-ldr-exc-2.c new file mode 100644 index 0000000..69a21d4 --- /dev/null +++ b/gdb/testsuite/gdb.threads/non-ldr-exc-2.c @@ -0,0 +1,70 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2009, 2010, 2011 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 <http://www.gnu.org/licenses/>. */ + +#include <pthread.h> +#include <unistd.h> +#include <stdlib.h> +#include <assert.h> + +static const char *image; +static volatile pthread_t main_thread; +static char *argv1 = "go away"; + +static void * +thread_execler (void *arg) +{ + int i; + + i = pthread_join (main_thread, NULL); + assert (i == 0); + + /* Exec ourselves again. */ + if (execl (image, image, argv1, NULL) == -1) /* break-here */ + { + perror ("execl"); + abort (); + } + + return NULL; +} + +int +main (int argc, char **argv) +{ + pthread_t thread; + int i; + + image = argv[0]; + + /* Pass "inf" as argument to keep re-execing ad infinitum, which can + be useful for manual testing. Passing any other argument exits + immediately (and that's what the execl above does by + default). */ + if (argc == 2 && strcmp (argv[1], "inf") == 0) + argv1 = argv[1]; + else if (argc > 1) + exit (0); + + main_thread = pthread_self (); + + i = pthread_create (&thread, NULL, thread_execler, NULL); + assert (i == 0); + + pthread_exit (NULL); + /* NOTREACHED */ + return 0; +} diff --git a/gdb/testsuite/gdb.threads/non-ldr-exc-2.exp b/gdb/testsuite/gdb.threads/non-ldr-exc-2.exp new file mode 100644 index 0000000..0686516 --- /dev/null +++ b/gdb/testsuite/gdb.threads/non-ldr-exc-2.exp @@ -0,0 +1,70 @@ +# Copyright 2009, 2010, 2011 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 <http://www.gnu.org/licenses/>. + +# Test that when a thread other than the main thread execs, we follow +# through to the new incarnation of the main thread, even if the main +# thread had already exited before the exec. + +# No exec event support in the remote protocol. +if { [is_remote target] } then { + continue +} + +set testfile "non-ldr-exc-2" +set srcfile ${testfile}.c +set executable ${testfile} +set binfile ${objdir}/${subdir}/${executable} + +if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + return -1 +} + +proc do_test { lock_sched } { + global pf_prefix + global executable + + set save_pf_prefix $pf_prefix + lappend pf_prefix "lock-sched$lock_sched:" + + clean_restart ${executable} + + if ![runto_main] { + set pf_prefix $save_pf_prefix + return -1 + } + + gdb_breakpoint [gdb_get_line_number "break-here"] + gdb_continue_to_breakpoint "break-here" ".* break-here .*" + + gdb_test "info threads" \ + "\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*" \ + "single thread left" + + # Also test with sched-lock to make sure we can follow the + # non-leader thread execing even though the main thread wasn't + # resumed before the exec. + if { $lock_sched } { + gdb_test_no_output "set scheduler-locking on" + } + + gdb_test "continue" \ + ".*is executing new program.*Breakpoint 1, main.* at .*" \ + "continue over exec" + + set pf_prefix $save_pf_prefix +} + +do_test 0 +do_test 1 diff --git a/gdb/testsuite/gdb.threads/non-ldr-exc-3.c b/gdb/testsuite/gdb.threads/non-ldr-exc-3.c new file mode 100644 index 0000000..64597e4 --- /dev/null +++ b/gdb/testsuite/gdb.threads/non-ldr-exc-3.c @@ -0,0 +1,100 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2009, 2010, 2011 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 <http://www.gnu.org/licenses/>. */ + +#include <pthread.h> +#include <unistd.h> +#include <stdlib.h> +#include <assert.h> + +static const char *image; +static volatile pthread_t main_thread; +static pthread_barrier_t barrier; +static char *argv1 = "go away"; + +static void * +thread_execler (void *arg) +{ + int i; + + pthread_barrier_wait (&barrier); + + i = pthread_join (main_thread, NULL); + assert (i == 0); + + /* Exec ourselves again. */ + if (execl (image, image, argv1, NULL) == -1) /* break-here */ + { + perror ("execl"); + abort (); + } + + return NULL; +} + +static void * +just_loop (void *arg) +{ + unsigned int i; + + pthread_barrier_wait (&barrier); + + for (i = 1; i > 0; i++) + usleep (1); + + return NULL; +} + +#define THREADS 5 + +pthread_t loop_thread[THREADS]; + +int +main (int argc, char **argv) +{ + pthread_t thread; + int i, t; + + image = argv[0]; + + /* Pass "inf" as argument to keep re-execing ad infinitum, which can + be useful for manual testing. Passing any other argument exits + immediately (and that's what the execl above does by + default). */ + if (argc == 2 && strcmp (argv[1], "inf") == 0) + argv1 = argv[1]; + else if (argc > 1) + exit (0); + + main_thread = pthread_self (); + + pthread_barrier_init (&barrier, NULL, 2 + THREADS); + + i = pthread_create (&thread, NULL, thread_execler, NULL); + assert (i == 0); + + for (t = 0; t < THREADS; t++) + { + i = pthread_create (&loop_thread[t], NULL, just_loop, NULL); + assert (i == 0); + } + + pthread_barrier_wait (&barrier); + + pthread_exit (NULL); + /* NOTREACHED */ + return 0; +} diff --git a/gdb/testsuite/gdb.threads/non-ldr-exc-3.exp b/gdb/testsuite/gdb.threads/non-ldr-exc-3.exp new file mode 100644 index 0000000..8eaafcf --- /dev/null +++ b/gdb/testsuite/gdb.threads/non-ldr-exc-3.exp @@ -0,0 +1,68 @@ +# Copyright 2009, 2010, 2011 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 <http://www.gnu.org/licenses/>. + +# Test that when a thread other than the main thread execs, we follow +# through to the new incarnation of the main thread, even if the main +# thread had already exited before the exec. This differs from +# non-ldr-exc-2.exp in that we have more than two threads in the +# program when the exec happens. + +# No exec event support in the remote protocol. +if { [is_remote target] } then { + continue +} + +set testfile "non-ldr-exc-3" +set srcfile ${testfile}.c +set executable ${testfile} +set binfile ${objdir}/${subdir}/${executable} + +if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + return -1 +} + +proc do_test { lock_sched } { + global pf_prefix + global executable + + set save_pf_prefix $pf_prefix + lappend pf_prefix "lock-sched$lock_sched:" + + clean_restart ${executable} + + if ![runto_main] { + set pf_prefix $save_pf_prefix + return -1 + } + + gdb_breakpoint [gdb_get_line_number "break-here"] + gdb_continue_to_breakpoint "break-here" ".* break-here .*" + + # Also test with sched-lock to make sure we can follow the + # non-leader thread execing even though the main thread wasn't + # resumed before the exec. + if { $lock_sched } { + gdb_test_no_output "set scheduler-locking on" + } + + gdb_test "continue" \ + ".*is executing new program.*Breakpoint 1, main.* at .*" \ + "continue over exec" + + set pf_prefix $save_pf_prefix +} + +do_test 0 +do_test 1 diff --git a/gdb/testsuite/gdb.threads/non-ldr-exc-4.c b/gdb/testsuite/gdb.threads/non-ldr-exc-4.c new file mode 100644 index 0000000..57dea04 --- /dev/null +++ b/gdb/testsuite/gdb.threads/non-ldr-exc-4.c @@ -0,0 +1,92 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2009, 2010, 2011 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 <http://www.gnu.org/licenses/>. */ + +#include <pthread.h> +#include <unistd.h> +#include <stdlib.h> +#include <assert.h> + +static const char *image; +static pthread_barrier_t barrier; +static char *argv1 = "go away"; + +static void * +thread_execler (void *arg) +{ + int i; + + pthread_barrier_wait (&barrier); + + /* Exec ourselves again. */ + if (execl (image, image, argv1, NULL) == -1) /* break-here */ + { + perror ("execl"); + abort (); + } + + return NULL; +} + +static void * +just_loop (void *arg) +{ + unsigned int i; + + pthread_barrier_wait (&barrier); + + for (i = 1; i > 0; i++) + usleep (1); + + return NULL; +} + +#define THREADS 5 + +pthread_t loop_thread[THREADS]; + +int +main (int argc, char **argv) +{ + pthread_t thread; + int i, t; + + image = argv[0]; + + /* Pass "inf" as argument to keep re-execing ad infinitum, which can + be useful for manual testing. Passing any other argument exits + immediately (and that's what the execl above does by + default). */ + if (argc == 2 && strcmp (argv[1], "inf") == 0) + argv1 = argv[1]; + else if (argc > 1) + exit (0); + + pthread_barrier_init (&barrier, NULL, 2 + THREADS); + + i = pthread_create (&thread, NULL, thread_execler, NULL); + assert (i == 0); + + for (t = 0; t < THREADS; t++) + { + i = pthread_create (&loop_thread[t], NULL, just_loop, NULL); + assert (i == 0); + } + + pthread_barrier_wait (&barrier); + pthread_join (thread, NULL); + return 0; +} diff --git a/gdb/testsuite/gdb.threads/non-ldr-exc-4.exp b/gdb/testsuite/gdb.threads/non-ldr-exc-4.exp new file mode 100644 index 0000000..3ca099b --- /dev/null +++ b/gdb/testsuite/gdb.threads/non-ldr-exc-4.exp @@ -0,0 +1,67 @@ +# Copyright 2009, 2010, 2011 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 <http://www.gnu.org/licenses/>. + +# Test that when a thread other than the main thread execs, we follow +# through to the new incarnation of the main thread. This differs +# from non-ldr-exc-1.exp in that we have more than two threads in the +# program when the exec happens. + +# No exec event support in the remote protocol. +if { [is_remote target] } then { + continue +} + +set testfile "non-ldr-exc-4" +set srcfile ${testfile}.c +set executable ${testfile} +set binfile ${objdir}/${subdir}/${executable} + +if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + return -1 +} + +proc do_test { lock_sched } { + global pf_prefix + global executable + + set save_pf_prefix $pf_prefix + lappend pf_prefix "lock-sched$lock_sched:" + + clean_restart ${executable} + + if ![runto_main] { + set pf_prefix $save_pf_prefix + return -1 + } + + gdb_breakpoint [gdb_get_line_number "break-here"] + gdb_continue_to_breakpoint "break-here" ".* break-here .*" + + # Also test with sched-lock to make sure we can follow the + # non-leader thread execing even though the main thread wasn't + # resumed before the exec. + if { $lock_sched } { + gdb_test_no_output "set scheduler-locking on" + } + + gdb_test "continue" \ + ".*is executing new program.*Breakpoint 1, main.* at .*" \ + "continue over exec" + + set pf_prefix $save_pf_prefix +} + +do_test 0 +do_test 1 |