--- /dev/null
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2016 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+volatile int global = 0;
+
+int
+main (void)
+{
+ global = 1;
+ global = 1;
+ global = 1;
+ global = 1;
+ global = 1;
+ global = 1;
+ global = 1;
+ global = 1; /* set break main console here */
+ global = 1;
+ global = 1;
+ global = 1;
+ global = 1;
+ global = 1;
+ global = 1;
+ global = 1;
+ global = 1; /* set break extra console here */
+ return 0;
+}
--- /dev/null
+# Copyright 2016 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+standard_testfile
+
+set compile_options "debug"
+if {[build_executable $testfile.exp $testfile ${srcfile} ${compile_options}] == -1} {
+ untested "failed to compile $testfile"
+ return -1
+}
+
+# Ensure no output has been sent. Use MESSAGE as test message.
+
+proc ensure_no_output {message} {
+ global decimal
+
+ # Run a command and use an anchor to make sure no output appears
+ # before the command's expected output.
+ gdb_test "print 999" "^print 999\r\n\\\$$decimal = 999" $message
+}
+
+# Run a few execution-related commands on CON1, and ensure the proper
+# output, or none, if appropriate, is sent to CON2. CON1_NAME and
+# CON2_NAME are the names of the consoles.
+
+proc do_execution_tests {con1 con1_name con2 con2_name} {
+ global srcfile
+ global decimal
+
+ set bp_lineno [gdb_get_line_number "set break $con1_name here"]
+
+ with_spawn_id $con1 {
+ gdb_test "next" "global = 1;"
+ }
+ with_spawn_id $con2 {
+ ensure_no_output "next causes no spurious output on other console"
+ }
+
+ with_spawn_id $con1 {
+ gdb_test "break $srcfile:$bp_lineno" \
+ "Breakpoint $decimal .*$srcfile, line $bp_lineno\\." \
+ "set breakpoint"
+ }
+ with_spawn_id $con2 {
+ ensure_no_output "break causes no spurious output on other console"
+ }
+
+ with_spawn_id $con1 {
+ gdb_test "continue" "set break $con1_name here .*" "continue to breakpoint"
+ }
+
+ with_spawn_id $con2 {
+ set test "breakpoint hit reported on other console"
+ gdb_test_multiple "" $test {
+ -re "Breakpoint $decimal, .* set break $con1_name here " {
+ pass $test
+ }
+ }
+ }
+}
+
+# The test proper.
+
+proc do_test {} {
+ global srcfile testfile
+ global gdb_prompt
+ global gdb_spawn_id
+ global gdb_main_spawn_id extra_spawn_id
+
+ clean_restart $testfile
+
+ if ![runto_main] {
+ untested "could not run to main"
+ return -1
+ }
+
+ gdb_test "new-ui" \
+ "usage: new-ui <interpreter> <tty>" \
+ "new-ui without arguments"
+
+ set test "new-ui does not repeat"
+ send_gdb "\n"
+ gdb_test_multiple "" $test {
+ -re "^\r\n$gdb_prompt $" {
+ pass $test
+ }
+ }
+
+ # Save the main UI's spawn ID.
+ set gdb_main_spawn_id $gdb_spawn_id
+
+ # Create the new PTY for the secondary console UI.
+ spawn -pty
+ set extra_spawn_id $spawn_id
+ set extra_tty_name $spawn_out(slave,name)
+ gdb_test_multiple "new-ui console $extra_tty_name" "new-ui" {
+ -re "New UI allocated\r\n$gdb_prompt $" {
+ }
+ }
+
+ with_spawn_id $extra_spawn_id {
+ set test "initial prompt on extra console"
+ gdb_test_multiple "" $test {
+ -re "$gdb_prompt $" {
+ pass $test
+ }
+ }
+ }
+
+ # Ensure non-execution commands in one console don't cause output
+ # in the other consoles.
+ with_spawn_id $gdb_main_spawn_id {
+ gdb_test "print 1" "^print 1\r\n\\\$1 = 1" "print on main console"
+ }
+ with_spawn_id $extra_spawn_id {
+ gdb_test "print 2" "^print 2\r\n\\\$2 = 2" "print on extra console"
+ }
+
+ # Run a few execution tests with the main console as the driver
+ # console.
+ with_test_prefix "main console" {
+ do_execution_tests \
+ $gdb_main_spawn_id "main console" \
+ $extra_spawn_id "extra console"
+ }
+ # Same, but with the extra console as driver.
+ with_test_prefix "extra console" {
+ do_execution_tests \
+ $extra_spawn_id "extra console" \
+ $gdb_main_spawn_id "main console"
+ }
+}
+
+do_test
}
}
+# Switch the default spawn id to SPAWN_ID, so that gdb_test,
+# mi_gdb_test etc. default to using it.
+
+proc switch_gdb_spawn_id {spawn_id} {
+ global gdb_spawn_id
+ global board board_info
+
+ set gdb_spawn_id $spawn_id
+ set board [host_info name]
+ set board_info($board,fileid) $spawn_id
+}
+
+# Run BODY with SPAWN_ID as current spawn id.
+
+proc with_spawn_id { spawn_id body } {
+ global gdb_spawn_id
+
+ set saved_spawn_id $gdb_spawn_id
+ switch_gdb_spawn_id $spawn_id
+
+ set code [catch {uplevel 1 $body} result]
+
+ switch_gdb_spawn_id $saved_spawn_id
+
+ if {$code == 1} {
+ global errorInfo errorCode
+ return -code $code -errorinfo $errorInfo -errorcode $errorCode $result
+ } else {
+ return -code $code $result
+ }
+}
+
# Select the largest timeout from all the timeouts:
# - the local "timeout" variable of the scope two levels above,
# - the global "timeout" variable,