+2014-02-21 Pedro Alves <palves@redhat.com>
+
+ * gdb.threads/step-after-sr-lock.c: Rename to ...
+ * gdb.threads/signal-while-stepping-over-bp-other-thread.c: ... this.
+ * gdb.threads/step-after-sr-lock.exp: Rename to ...
+ * gdb.threads/signal-while-stepping-over-bp-other-thread.exp:
+ ... this.
+
2014-02-20 Sergio Durigan Junior <sergiodj@redhat.com>
PR tdep/16397
--- /dev/null
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2009-2014 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 <signal.h>
+
+unsigned int args[2];
+
+pid_t pid;
+pthread_barrier_t barrier;
+pthread_t child_thread_2, child_thread_3;
+
+void
+handler (int signo)
+{
+ /* so that thread 3 is sure to run, in case the bug is present. */
+ usleep (10);
+}
+
+void
+callme (void)
+{
+}
+
+void
+block_signals (void)
+{
+ sigset_t mask;
+
+ sigfillset (&mask);
+ sigprocmask (SIG_BLOCK, &mask, NULL);
+}
+
+void
+unblock_signals (void)
+{
+ sigset_t mask;
+
+ sigfillset (&mask);
+ sigprocmask (SIG_UNBLOCK, &mask, NULL);
+}
+
+void *
+child_function_3 (void *arg)
+{
+ int my_number = (long) arg;
+ volatile int *myp = (int *) &args[my_number];
+
+ pthread_barrier_wait (&barrier);
+
+ while (*myp > 0)
+ {
+ (*myp) ++; /* set breakpoint child_two here */
+ callme ();
+ }
+
+ pthread_exit (NULL);
+}
+
+void *
+child_function_2 (void *arg)
+{
+ int my_number = (long) arg;
+ volatile int *myp = (int *) &args[my_number];
+
+ unblock_signals ();
+
+ pthread_barrier_wait (&barrier);
+
+ while (*myp > 0)
+ {
+ (*myp) ++;
+ callme (); /* set breakpoint child_one here */
+ }
+
+ *myp = 1;
+ while (*myp > 0)
+ {
+ (*myp) ++;
+ callme ();
+ }
+
+ pthread_exit (NULL);
+}
+
+
+int
+main ()
+{
+ int res;
+ long i;
+
+ /* Block signals in all threads but one, so that we're sure which
+ thread gets the signal we send from the command line. */
+ block_signals ();
+
+ signal (SIGUSR1, handler);
+
+ /* Call these early so that PLTs for these are resolved soon,
+ instead of in the threads. RTLD_NOW should work as well. */
+ usleep (0);
+ pthread_barrier_init (&barrier, NULL, 1);
+ pthread_barrier_wait (&barrier);
+
+ pthread_barrier_init (&barrier, NULL, 2);
+
+ /* The test uses this global to know where to send the signal
+ to. */
+ pid = getpid ();
+
+ i = 0;
+ args[i] = 1;
+ res = pthread_create (&child_thread_2,
+ NULL, child_function_2, (void *) i);
+ pthread_barrier_wait (&barrier);
+ callme (); /* set wait-thread-2 breakpoint here */
+
+ i = 1;
+ args[i] = 1;
+ res = pthread_create (&child_thread_3,
+ NULL, child_function_3, (void *) i);
+ pthread_barrier_wait (&barrier);
+ callme (); /* set wait-thread-3 breakpoint here */
+
+ pthread_join (child_thread_2, NULL);
+ pthread_join (child_thread_3, NULL);
+
+ exit(EXIT_SUCCESS);
+}
--- /dev/null
+# Copyright (C) 2011-2014 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 GDB doesn't inadvertently resume the stepped thread when a
+# signal arrives while stepping over the breakpoint that last caused a
+# stop, when the thread that hit that breakpoint is not the stepped
+# thread.
+
+standard_testfile
+set executable ${testfile}
+
+if [target_info exists gdb,nosignals] {
+ verbose "Skipping ${testfile}.exp because of nosignals."
+ return -1
+}
+
+# Test uses host "kill".
+if { [is_remote target] } {
+ return -1
+}
+
+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
+ executable [list debug "incdir=${objdir}"]] != "" } {
+ return -1
+}
+
+proc get_value {var test} {
+ global expect_out
+ global gdb_prompt
+ global decimal
+
+ set value -1
+ gdb_test_multiple "print $var" "$test" {
+ -re ".*= ($decimal).*\r\n$gdb_prompt $" {
+ set value $expect_out(1,string)
+ pass "$test"
+ }
+ }
+ return ${value}
+}
+
+# Start with a fresh gdb.
+
+clean_restart $executable
+
+if ![runto_main] {
+ return -1
+}
+
+gdb_breakpoint [gdb_get_line_number "set wait-thread-2 breakpoint here"]
+gdb_continue_to_breakpoint "run to wait-thread-2 breakpoint"
+gdb_test "info threads" "" "info threads with thread 2"
+
+gdb_breakpoint [gdb_get_line_number "set wait-thread-3 breakpoint here"]
+gdb_continue_to_breakpoint "run to breakpoint"
+gdb_test "info threads" "" "info threads with thread 3"
+
+set testpid [get_value "pid" "get pid of inferior"]
+if { $testpid == -1 } {
+ return -1
+}
+
+gdb_test "set scheduler-locking on"
+
+gdb_breakpoint [gdb_get_line_number "set breakpoint child_two here"]
+gdb_breakpoint [gdb_get_line_number "set breakpoint child_one here"]
+
+gdb_test "thread 3" "" "switch to thread 3 to run to its breakpoint"
+gdb_continue_to_breakpoint "run to breakpoint in thread 3"
+
+gdb_test "thread 2" "" "switch to thread 2 to run to its breakpoint"
+gdb_continue_to_breakpoint "run to breakpoint in thread 2"
+
+delete_breakpoints
+
+gdb_test "b *\$pc" "" "set breakpoint to be stepped over"
+# Make sure the first loop breaks without hitting the breakpoint
+# again.
+gdb_test "p *myp = 0" " = 0" "force loop break in thread 2"
+
+# We want "print" to make sure the target reports the signal to the
+# core.
+gdb_test "handle SIGUSR1 print nostop pass" "" ""
+
+# Queue a signal in thread 2.
+remote_exec host "kill -SIGUSR1 ${testpid}"
+
+gdb_test "thread 3" "" "switch to thread 3 for stepping"
+set my_number [get_value "my_number" "get my_number"]
+set cnt_before [get_value "args\[$my_number\]" "get count before step"]
+gdb_test "set scheduler-locking off"
+
+# Make sure we're exercising the paths we want to.
+gdb_test "set debug infrun 1"
+
+gdb_test \
+ "step" \
+ ".*prepare_to_proceed \\(step=1\\), switched to.*signal arrived while stepping over breakpoint.*switching back to stepped thread.*stepped to a different line.*callme.*" \
+ "step"
+
+set cnt_after [get_value "args\[$my_number\]" "get count after step"]
+
+# Test that GDB doesn't inadvertently resume the stepped thread when a
+# signal arrives while stepping over a breakpoint in another thread.
+
+set test "stepped thread under control"
+if { $cnt_before + 1 == $cnt_after } {
+ pass $test
+} else {
+ fail $test
+}
+++ /dev/null
-/* This testcase is part of GDB, the GNU debugger.
-
- Copyright 2009-2014 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 <signal.h>
-
-unsigned int args[2];
-
-pid_t pid;
-pthread_barrier_t barrier;
-pthread_t child_thread_2, child_thread_3;
-
-void
-handler (int signo)
-{
- /* so that thread 3 is sure to run, in case the bug is present. */
- usleep (10);
-}
-
-void
-callme (void)
-{
-}
-
-void
-block_signals (void)
-{
- sigset_t mask;
-
- sigfillset (&mask);
- sigprocmask (SIG_BLOCK, &mask, NULL);
-}
-
-void
-unblock_signals (void)
-{
- sigset_t mask;
-
- sigfillset (&mask);
- sigprocmask (SIG_UNBLOCK, &mask, NULL);
-}
-
-void *
-child_function_3 (void *arg)
-{
- int my_number = (long) arg;
- volatile int *myp = (int *) &args[my_number];
-
- pthread_barrier_wait (&barrier);
-
- while (*myp > 0)
- {
- (*myp) ++; /* set breakpoint child_two here */
- callme ();
- }
-
- pthread_exit (NULL);
-}
-
-void *
-child_function_2 (void *arg)
-{
- int my_number = (long) arg;
- volatile int *myp = (int *) &args[my_number];
-
- unblock_signals ();
-
- pthread_barrier_wait (&barrier);
-
- while (*myp > 0)
- {
- (*myp) ++;
- callme (); /* set breakpoint child_one here */
- }
-
- *myp = 1;
- while (*myp > 0)
- {
- (*myp) ++;
- callme ();
- }
-
- pthread_exit (NULL);
-}
-
-
-int
-main ()
-{
- int res;
- long i;
-
- /* Block signals in all threads but one, so that we're sure which
- thread gets the signal we send from the command line. */
- block_signals ();
-
- signal (SIGUSR1, handler);
-
- /* Call these early so that PLTs for these are resolved soon,
- instead of in the threads. RTLD_NOW should work as well. */
- usleep (0);
- pthread_barrier_init (&barrier, NULL, 1);
- pthread_barrier_wait (&barrier);
-
- pthread_barrier_init (&barrier, NULL, 2);
-
- /* The test uses this global to know where to send the signal
- to. */
- pid = getpid ();
-
- i = 0;
- args[i] = 1;
- res = pthread_create (&child_thread_2,
- NULL, child_function_2, (void *) i);
- pthread_barrier_wait (&barrier);
- callme (); /* set wait-thread-2 breakpoint here */
-
- i = 1;
- args[i] = 1;
- res = pthread_create (&child_thread_3,
- NULL, child_function_3, (void *) i);
- pthread_barrier_wait (&barrier);
- callme (); /* set wait-thread-3 breakpoint here */
-
- pthread_join (child_thread_2, NULL);
- pthread_join (child_thread_3, NULL);
-
- exit(EXIT_SUCCESS);
-}
+++ /dev/null
-# Copyright (C) 2011-2014 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 GDB doesn't inadvertently resume the stepped thread when a
-# signal arrives while stepping over the breakpoint that last caused a
-# stop, when the thread that hit that breakpoint is not the stepped
-# thread.
-
-standard_testfile
-set executable ${testfile}
-
-if [target_info exists gdb,nosignals] {
- verbose "Skipping ${testfile}.exp because of nosignals."
- return -1
-}
-
-# Test uses host "kill".
-if { [is_remote target] } {
- return -1
-}
-
-if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
- executable [list debug "incdir=${objdir}"]] != "" } {
- return -1
-}
-
-proc get_value {var test} {
- global expect_out
- global gdb_prompt
- global decimal
-
- set value -1
- gdb_test_multiple "print $var" "$test" {
- -re ".*= ($decimal).*\r\n$gdb_prompt $" {
- set value $expect_out(1,string)
- pass "$test"
- }
- }
- return ${value}
-}
-
-# Start with a fresh gdb.
-
-clean_restart $executable
-
-if ![runto_main] {
- return -1
-}
-
-gdb_breakpoint [gdb_get_line_number "set wait-thread-2 breakpoint here"]
-gdb_continue_to_breakpoint "run to wait-thread-2 breakpoint"
-gdb_test "info threads" "" "info threads with thread 2"
-
-gdb_breakpoint [gdb_get_line_number "set wait-thread-3 breakpoint here"]
-gdb_continue_to_breakpoint "run to breakpoint"
-gdb_test "info threads" "" "info threads with thread 3"
-
-set testpid [get_value "pid" "get pid of inferior"]
-if { $testpid == -1 } {
- return -1
-}
-
-gdb_test "set scheduler-locking on"
-
-gdb_breakpoint [gdb_get_line_number "set breakpoint child_two here"]
-gdb_breakpoint [gdb_get_line_number "set breakpoint child_one here"]
-
-gdb_test "thread 3" "" "switch to thread 3 to run to its breakpoint"
-gdb_continue_to_breakpoint "run to breakpoint in thread 3"
-
-gdb_test "thread 2" "" "switch to thread 2 to run to its breakpoint"
-gdb_continue_to_breakpoint "run to breakpoint in thread 2"
-
-delete_breakpoints
-
-gdb_test "b *\$pc" "" "set breakpoint to be stepped over"
-# Make sure the first loop breaks without hitting the breakpoint
-# again.
-gdb_test "p *myp = 0" " = 0" "force loop break in thread 2"
-
-# We want "print" to make sure the target reports the signal to the
-# core.
-gdb_test "handle SIGUSR1 print nostop pass" "" ""
-
-# Queue a signal in thread 2.
-remote_exec host "kill -SIGUSR1 ${testpid}"
-
-gdb_test "thread 3" "" "switch to thread 3 for stepping"
-set my_number [get_value "my_number" "get my_number"]
-set cnt_before [get_value "args\[$my_number\]" "get count before step"]
-gdb_test "set scheduler-locking off"
-
-# Make sure we're exercising the paths we want to.
-gdb_test "set debug infrun 1"
-
-gdb_test \
- "step" \
- ".*prepare_to_proceed \\(step=1\\), switched to.*signal arrived while stepping over breakpoint.*switching back to stepped thread.*stepped to a different line.*callme.*" \
- "step"
-
-set cnt_after [get_value "args\[$my_number\]" "get count after step"]
-
-# Test that GDB doesn't inadvertently resume the stepped thread when a
-# signal arrives while stepping over a breakpoint in another thread.
-
-set test "stepped thread under control"
-if { $cnt_before + 1 == $cnt_after } {
- pass $test
-} else {
- fail $test
-}