forked from Imagelibrary/binutils-gdb
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:
@@ -26,12 +26,14 @@
|
|||||||
|
|
||||||
static pthread_barrier_t barrier;
|
static pthread_barrier_t barrier;
|
||||||
|
|
||||||
|
volatile int exit_thread;
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
thread_start (void *arg)
|
thread_start (void *arg)
|
||||||
{
|
{
|
||||||
pthread_barrier_wait (&barrier);
|
pthread_barrier_wait (&barrier);
|
||||||
|
|
||||||
while (1)
|
while (!exit_thread)
|
||||||
sleep (1);
|
sleep (1);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
# Make a core file with two threads upfront. Several tests load the
|
||||||
# same core file.
|
# same core file.
|
||||||
prepare_core
|
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
|
cleanup_gdbservers
|
||||||
|
|||||||
Reference in New Issue
Block a user