Testcase for previous handle_no_resumed fixes
authorPedro Alves <pedro@palves.net>
Sat, 4 Jul 2020 18:26:59 +0000 (19:26 +0100)
committerPedro Alves <palves@redhat.com>
Fri, 10 Jul 2020 22:51:11 +0000 (23:51 +0100)
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.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.multi/multi-target.c
gdb/testsuite/gdb.multi/multi-target.exp

index 6810ef682b0662e4f4c03a03dcb6e6aa200071ad..c0f1f1cc14c3c50a414823aeaab35b09a7d3b93f 100644 (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.
index 23ec6bd600f86fe40904b8069baa815e6bd7b9e4..b337e59a1196535a75bd61f266dc7948fb4842f1 100644 (file)
 
 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;
 }
index b519eda4e8dba60941306ecefc8b38863712833b..d19cee6595a024c8a7707a124eadf0649881403f 100644 (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