# Copyright (C) 2009-2025 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/>.

require allow_fork_tests

standard_testfile

if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    return -1
}

clean_restart ${binfile}

if {![runto_main]} {
   return 0
}

gdb_test_no_output "set follow-fork-mode child" "1, set follow-fork-mode child"
gdb_test "catch fork" "Catchpoint \[0-9\]* \\(fork\\)" "1, insert fork catchpoint"
gdb_breakpoint "start" "" "1, set breakpoint at start"

gdb_test "continue" "Catchpoint.*" "1, get to the fork event"

gdb_test "info threads" " ${tdlabel_re} .* ${tdlabel_re} .* ${tdlabel_re} .* ${tdlabel_re} .*" "1, multiple threads found"

gdb_test "thread 1" ".*" "1, switched away from event thread"

gdb_test "continue" "Not resuming.*" "1, refused to resume"

set test "1, followed to the child, found one thread"
gdb_test_multiple "info threads" "metest" {
    -re " ${tdlabel_re} .* ${tdlabel_re} .*$gdb_prompt $" {
	fail "$test"
    }
    -re " ${tdlabel_re} .*$gdb_prompt $" {
	pass "$test"
    }
    -re "$gdb_prompt $" {
	fail "$test (unknown output)"
    }
    timeout {
	fail "$test (timeout)"
    }
}

gdb_test "continue" "Breakpoint 3, start.*" "1, get to the spawned thread in fork child"

set test "1, followed to the child, found two threads"
gdb_test_multiple "info threads" "$test" {
    -re " ${tdlabel_re} .* ${tdlabel_re} .* ${tdlabel_re} .*$gdb_prompt $" {
	fail "$test"
    }
    -re " ${tdlabel_re} .* ${tdlabel_re} .*$gdb_prompt $" {
	pass "$test"
    }
    -re "$gdb_prompt $" {
	fail "$test (unknown output)"
    }
    timeout {
	fail "$test (timeout)"
    }
}

# Start over, but this time, don't switch away from the fork event thread.

clean_restart $binfile
if {![runto_main]} {
   return 0
}

gdb_test_no_output "set follow-fork-mode child" "2, set follow-fork-mode child"
gdb_test "catch fork" "Catchpoint \[0-9\]* \\(fork\\)" "2, insert fork catchpoint"
gdb_breakpoint "start"

gdb_test "continue" "Catchpoint.*" "2, get to the fork event"

gdb_test "info threads" " ${tdlabel_re} .* ${tdlabel_re} .* ${tdlabel_re} .* ${tdlabel_re} .*" "2, multiple threads found"

gdb_test "continue" "Breakpoint 3, start.*" "2, get to the spawned thread in fork child"

set test "2, followed to the child, found two threads"
gdb_test_multiple "info threads" "$test" {
    -re " ${tdlabel_re} .* ${tdlabel_re} .* ${tdlabel_re} .*$gdb_prompt $" {
	fail "$test"
    }
    -re " ${tdlabel_re} .* ${tdlabel_re} .*$gdb_prompt $" {
	pass "$test"
    }
    -re "$gdb_prompt $" {
	fail "$test (unknown output)"
    }
    timeout {
	fail "$test (timeout)"
    }
}
