diff options
author | Pedro Alves <pedro@palves.net> | 2020-07-04 19:26:59 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2020-07-10 23:51:11 +0100 |
commit | 4fdba23df6d202b9d428818fc209e527797b576f (patch) | |
tree | 08078a1e0b8e6807d70aaebfacce6c19a6d107ae | |
parent | d6cc5d980a902d273d424c49fc55e77757c3a05d (diff) | |
download | gdb-4fdba23df6d202b9d428818fc209e527797b576f.zip gdb-4fdba23df6d202b9d428818fc209e527797b576f.tar.gz gdb-4fdba23df6d202b9d428818fc209e527797b576f.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/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/testsuite/gdb.multi/multi-target.c | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.multi/multi-target.exp | 76 |
3 files changed, 87 insertions, 1 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 6810ef6..c0f1f1c 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -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. 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 |