# Copyright (C) 2009-2020 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 {
   fail "can't run to 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" " 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 {
   fail "can't run to 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" " 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)"
    }
}
