aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <pedro@palves.net>2020-07-04 19:26:59 +0100
committerPedro Alves <palves@redhat.com>2020-07-06 19:58:09 +0100
commit419e460addc0ffb1f18e8d10c58e41207f1518a2 (patch)
tree6c5e9be8eed166cba154be744d1c6fbd29a04f40
parent367aff81be9d8fcdae383d72a555b14998aa3251 (diff)
downloadgdb-419e460addc0ffb1f18e8d10c58e41207f1518a2.zip
gdb-419e460addc0ffb1f18e8d10c58e41207f1518a2.tar.gz
gdb-419e460addc0ffb1f18e8d10c58e41207f1518a2.tar.bz2
Testcase for previous handle_no_resumed fixes
This adds a testcase that covers the scenarios described in the previous two commits. gdb/testsuite/ChangeLog: PR gdb/26199 * gdb.multi/multi-target.c (exit_thread): New. (thread_start): Break loop if EXIT_THREAD. * gdb.multi/multi-target.exp (test_no_unwaited_for): New proc. (top level) Call test_no_resumed.
-rw-r--r--gdb/testsuite/gdb.multi/multi-target.c4
-rw-r--r--gdb/testsuite/gdb.multi/multi-target.exp76
2 files changed, 79 insertions, 1 deletions
diff --git a/gdb/testsuite/gdb.multi/multi-target.c b/gdb/testsuite/gdb.multi/multi-target.c
index 23ec6bd..b337e59 100644
--- a/gdb/testsuite/gdb.multi/multi-target.c
+++ b/gdb/testsuite/gdb.multi/multi-target.c
@@ -26,12 +26,14 @@
static pthread_barrier_t barrier;
+volatile int exit_thread;
+
static void *
thread_start (void *arg)
{
pthread_barrier_wait (&barrier);
- while (1)
+ while (!exit_thread)
sleep (1);
return NULL;
}
diff --git a/gdb/testsuite/gdb.multi/multi-target.exp b/gdb/testsuite/gdb.multi/multi-target.exp
index b519eda..d19cee6 100644
--- a/gdb/testsuite/gdb.multi/multi-target.exp
+++ b/gdb/testsuite/gdb.multi/multi-target.exp
@@ -439,6 +439,77 @@ proc test_info_inferiors {multi_process} {
}
}
+# Test that when there's a foreground execution command in progress, a
+# TARGET_WAITKIND_NO_RESUMED for a particular target is ignored when
+# other targets are still resumed.
+
+proc test_no_resumed {} {
+ proc test_no_resumed_infs {inf_A inf_B} {
+ global gdb_prompt
+
+ if {![setup "off"]} {
+ untested "setup failed"
+ return
+ }
+
+ gdb_test "thread $inf_A.2" "Switching to thread $inf_A\.2 .*" \
+ "select thread of target A"
+
+ gdb_test_no_output "set scheduler-locking on"
+
+ gdb_test_multiple "continue &" "" {
+ -re "Continuing.*$gdb_prompt " {
+ pass $gdb_test_name
+ }
+ }
+
+ gdb_test "thread $inf_B.2" "Switching to thread $inf_B\.2 .*" \
+ "select thread of target B"
+ gdb_test "p exit_thread = 1" " = 1" \
+ "set the thread to exit on resumption"
+
+ # Wait 3 seconds. If we see any response from GDB, such as
+ # "No unwaited-for children left." it's a bug.
+ gdb_test_multiple "continue" "continue" {
+ -timeout 3
+ timeout {
+ pass $gdb_test_name
+ }
+ }
+
+ # Now stop the program (all targets).
+ send_gdb "\003"
+ gdb_test_multiple "" "send_gdb control C" {
+ -re "received signal SIGINT.*$gdb_prompt $" {
+ pass $gdb_test_name
+ }
+ }
+
+ gdb_test_multiple "info threads" "all threads stopped" {
+ -re "\\\(running\\\).*$gdb_prompt $" {
+ fail $gdb_test_name
+ }
+ -re "$gdb_prompt $" {
+ pass $gdb_test_name
+ }
+ }
+ }
+
+ # inferior 1 -> native
+ # inferior 2 -> extended-remote 1
+ # inferior 5 -> extended-remote 2
+ set inferiors {1 2 5}
+ foreach_with_prefix inf_A $inferiors {
+ foreach_with_prefix inf_B $inferiors {
+ if {$inf_A == $inf_B} {
+ continue
+ }
+ test_no_resumed_infs $inf_A $inf_B
+ }
+ }
+}
+
+
# Make a core file with two threads upfront. Several tests load the
# same core file.
prepare_core
@@ -467,4 +538,9 @@ with_test_prefix "info-inferiors" {
}
}
+# Test TARGET_WAITKIND_NO_RESUMED handling with multiple targets.
+with_test_prefix "no-resumed" {
+ test_no_resumed
+}
+
cleanup_gdbservers