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

# Only GNU/Linux is known to support `set follow-fork-mode child'.
#
if { ! [istarget "*-*-linux*"] } {
    return 0
}

standard_testfile

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

clean_restart ${binfile}

if ![runto_main] then {
   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" " Thread .* Thread .* Thread .* Thread .*" "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 " Thread .* Thread .*$gdb_prompt $" {
	fail "$test"
    }
    -re " Thread .*$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 " Thread .* Thread .* Thread .*$gdb_prompt $" {
	fail "$test"
    }
    -re " Thread .* Thread .*$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.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

gdb_load ${binfile}
if ![runto_main] then {
   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" " Thread .* Thread .* Thread .* Thread .*" "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 " Thread .* Thread .* Thread .*$gdb_prompt $" {
	fail "$test"
    }
    -re " Thread .* Thread .*$gdb_prompt $" {
	pass "$test"
    }
    -re "$gdb_prompt $" {
	fail "$test (unknown output)"
    }
    timeout {
	fail "$test (timeout)"
    }
}
