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

# There's no support for `set follow-fork-mode' in the remote
# protocol.
if { [is_remote target] } {
    return 0
}

# 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 2" ".*" "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)"
    }
}
