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.
This commit is contained in:
Pedro Alves 2020-07-04 19:26:59 +01:00 committed by Pedro Alves
parent d6cc5d980a
commit 4fdba23df6
3 changed files with 87 additions and 1 deletions

View File

@ -1,3 +1,11 @@
2020-07-10 Pedro Alves <pedro@palves.net>
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.
2020-07-08 Tom Tromey <tromey@adacore.com>
* gdb.ada/catch_ex/foo.adb: Pass string to raise.

View File

@ -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;
}

View File

@ -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