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

set testfile fork-thread-pending
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

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

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 "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 "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)"
    }
}
