# Copyright 2021 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/>.

# Test doing a "run" or an "attach" while the program is running.
#
# We test a non-threaded and a threaded configuration, so that targets
# that don't support threads get some testing, but we also test with
# threads when possible in case that triggers some
# multi-thread-specific bugs.

standard_testfile

set binfile_threads ${binfile}-threads
set binfile_nothreads ${binfile}-nothreads
unset binfile

# Valid parameter / axis values:
#
#   - non-stop: "off" of "on"
#   - threaded: 0 or 1
#   - run-or-attach: "run" or "attach"

proc_with_prefix test { non-stop threaded run-or-attach } {
    global gdb_prompt

    if { ${run-or-attach} == "attach" && ![can_spawn_for_attach] } {
	unsupported "attach not supported"
	return
    }

    save_vars ::GDBFLAGS {
	set ::GDBFLAGS "$::GDBFLAGS -ex \"set non-stop ${non-stop}\""

	# The test doesn't work when the remote target uses the
	# synchronous remote protocol, because GDB can't kill the
	# remote inferior while it is running, when we "run" or
	# "attach" again.  When aswering "yes" to the "Start it from
	# the beginning?" question, we otherwise get:
	#
	#   Cannot execute this command while the target is running.  Use the
	#   "interrupt" command to stop the target and then try again.
	#
	# Interrupting the target would defeat the purpose of the
	# test.  So when non-stop is off and using the remote target,
	# force the target to use the async / non-stop version of the
	# protocol.
	if { [target_info exists gdb_protocol] && ${non-stop} == "off" } {
	    set ::GDBFLAGS "$::GDBFLAGS -ex \"maint set target-non-stop on\""
	}

	clean_restart $::binfile
    }

    if { ![runto_main] } {
	untested "could not run to main"
	return
    }

    gdb_breakpoint "all_started" "temporary"
    gdb_continue_to_breakpoint "continue to all_started"

    # If all-stop, everything stopped when we hit the all_started
    # breakpoint, so resume execution in background.  If running the
    # non-threaded version, our only thread is stopped in any case, so
    # resume as well.  But if we are in non-stop with two threads, we
    # have one running and one stopped, leave it like this, it makes
    # an interesting test case.
    if { ${non-stop} == "off" || !${threaded} } {
	gdb_test "continue &" "Continuing."
    }

    gdb_test_no_output "set confirm off"

    # Run again (or, connect to a new stub if using a stub), take
    # advantage of the fact that runto_main leaves the breakpoint on
    # main in place.
    if { ${run-or-attach} == "run" } {
	gdb_run_cmd
	gdb_test "" "Breakpoint $::decimal, .*main.*" "hit main breakpoint after re-run"
    } elseif { ${run-or-attach} == "attach" } {
	set test_spawn_id [spawn_wait_for_attach $::binfile]
	set test_pid [spawn_id_get_pid $test_spawn_id]

	gdb_test_multiple "attach $test_pid" "attach to process" {
	    -re "Attaching to program: .*$gdb_prompt " {
		pass $gdb_test_name
	    }
	}

	gdb_exit
	kill_wait_spawned_process $test_spawn_id
    } else {
	error "Invalid value for run-or-attach"
    }
}

foreach_with_prefix threaded {0 1} {
    set options [list debug additional_flags=-DWITH_THREADS=$threaded]
    if { $threaded } {
	set binfile $binfile_threads
	lappend options pthreads
    } else {
	set binfile $binfile_nothreads
    }
    if { [build_executable "failed to prepare" ${binfile} ${srcfile} $options] } {
	continue
    }

    foreach_with_prefix run-or-attach {run attach} {
	foreach_with_prefix non-stop {off on} {
	    test ${non-stop} ${threaded} ${run-or-attach}
	}
    }
}
