# Copyright (C) 2015-2024 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/>.

# This test verifies that threads created by the child fork are
# properly handled.  Specifically, GDB used to have a bug where it
# would leave child fork threads stuck stopped, even though "info
# threads" would show them running.
#
# See https://sourceware.org/bugzilla/show_bug.cgi?id=18600

# In remote mode, we cannot continue debugging after all
# inferiors have terminated, and this test requires that.
if { [target_info exists gdb_protocol]
     && [target_info gdb_protocol] == "remote" } {
    return
}

standard_testfile

proc do_test { detach-on-fork } {
    global GDBFLAGS
    global srcfile testfile
    global gdb_prompt

    save_vars { GDBFLAGS } {
	set GDBFLAGS [concat $GDBFLAGS " -ex \"set non-stop on\""]

	if {[prepare_for_testing "failed to prepare" \
		 $testfile $srcfile {debug pthreads}] == -1} {
	    return -1
	}
    }

    if {![runto_main]} {
	return 0
    }

    gdb_test_no_output "set detach-on-fork ${detach-on-fork}"
    set test "continue &"
    gdb_test_multiple $test $test {
	-re "$gdb_prompt " {
	    pass $test
	}
    }

    # gdbserver had a bug that resulted in reporting the fork child's
    # initial stop to gdb, which gdb does not expect, in turn
    # resulting in a broken session, like:
    #
    #  [Thread 31536.31536] #16 stopped.                                <== BAD
    #  [New Thread 31547.31547]
    #  [Inferior 10 (process 31536) exited normally]
    #  [New Thread 31547.31560]
    #
    #  [Thread 31547.31547] #18 stopped.                                <== BAD
    #  Cannot remove breakpoints because program is no longer writable. <== BAD
    #  Further execution is probably impossible.                        <== BAD
    #  [Inferior 11 (process 31547) exited normally]
    #  [Inferior 1 (process 31454) exited normally]
    #
    # These variables track whether we see such broken behavior.
    set saw_cannot_remove_breakpoints 0
    set saw_thread_stopped 0

    set expected_num_inferior_exits [expr ${detach-on-fork} == "off" ? 11 : 1]

    # Flags indicating if we have see the exit for each inferior.
    for {set i 1} {$i <= $expected_num_inferior_exits} {incr i} {
	set inferior_exits_seen($i) 0
    }

    # Number of inferior exits seen so far.
    set num_inferior_exits_seen 0

    set test "inferior 1 exited"
    gdb_test_multiple "" $test {
	-re "^Cannot remove breakpoints" {
	    set saw_cannot_remove_breakpoints 1
	    exp_continue
	}
	-re "^\\\[Thread \[^\r\n\]+ stopped\\." {
	    set saw_thread_stopped 1
	    exp_continue
	}
	-re "^\\\[Inferior ($::decimal) \(\[^\r\n\]+\) exited normally\\\]" {
	    set infnum $expect_out(1,string)
	    incr num_inferior_exits_seen
	    incr inferior_exits_seen($infnum) 1

	    if { $num_inferior_exits_seen == $expected_num_inferior_exits } {
		pass $test
	    } else {
		exp_continue
	    }
	}
	-re "^\[^\r\n]*\r\n" {
	    # Skip line.
	    exp_continue
	}
    }

    # Verify that we got all the inferior exits we expected.
    set num_ok_exits 0
    for {set i 1} {$i <= $expected_num_inferior_exits} {incr i} {
	if { $inferior_exits_seen($i) == 1 } {
	    incr num_ok_exits
	}
    }

    gdb_assert { $num_ok_exits == $expected_num_inferior_exits } \
	"seen all expected inferior exits"

    gdb_assert !$saw_cannot_remove_breakpoints \
	"no failure to remove breakpoints"
    gdb_assert !$saw_thread_stopped \
	"no spurious thread stop"

    gdb_test "info threads" "No threads\." \
	"no threads left"

    gdb_test "info inferiors" \
	"Num\[ \t\]+Description\[ \t\]+Connection\[ \t\]+Executable\[ \t\]+\r\n\\* 1 \[^\r\n\]+" \
	"only inferior 1 left"
}

foreach_with_prefix detach-on-fork {"on" "off"} {
    do_test ${detach-on-fork}
}
