#   Copyright 2005-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/>.

if { [is_remote target] || ![isnative] } then {
    continue
}

# Until "set follow-fork-mode" and "catch fork" are implemented on
# other targets...
#
if {![istarget "hppa*-hp-hpux*"] && ![istarget "*-*-linux*"]} then {
    continue
}


standard_testfile .c

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested multi-forks.exp
     return -1
}

# Start with a fresh gdb

clean_restart ${binfile}

global gdb_prompt

# This is a test of gdb's ability to follow the parent, child or both
# parent and child of multiple Unix fork() system calls.

set exit_bp_loc [gdb_get_line_number "Set exit breakpoint here."]

# Insert a breakpoint at the location provided by the exit_bp_loc global
# and resume the execution until hitting that breakpoint.  We also make
# sure to consume all the expected output from all processes as well,
# to make sure it doesn't cause trouble during a subsequent test.

proc continue_to_exit_bp_loc {} {
    global exit_bp_loc decimal gdb_prompt

    gdb_breakpoint $exit_bp_loc

    send_gdb "continue\n"

    # The output from the child processes can be interleaved arbitrarily
    # with the output from GDB and the parent process.  If we don't
    # consume it all now, it can confuse later interactions.
    set seen_done 0
    set seen_break 0
    set seen_prompt 0
    set seen_timeout 0
    while { ($seen_done < 16 || ! $seen_prompt) && ! $seen_timeout } {
	# We don't know what order the interesting things will arrive in.
	# Using a pattern of the form 'x|y|z' instead of -re x ... -re y
	# ... -re z ensures that expect always chooses the match that
	# occurs leftmost in the input, and not the pattern appearing
	# first in the script that occurs anywhere in the input, so that
	# we don't skip anything.
	gdb_expect {
	    -re "($decimal done)|(Breakpoint)|($gdb_prompt)" {
		if {[info exists expect_out(1,string)]} {
		    incr seen_done
		} elseif {[info exists expect_out(2,string)]} {
		    set seen_break 1
		} elseif {[info exists expect_out(3,string)]} {
		    set seen_prompt 1
		}
		array unset expect_out
	    }
	    timeout { set seen_timeout 1 }
	}
    }

    if { $seen_timeout } {
	fail "run to exit 2 (timeout)"
    } elseif { ! $seen_prompt } {
	fail "run to exit 2 (no prompt)"
    } elseif { ! $seen_break } {
	fail "run to exit 2 (no breakpoint hit)"
    } elseif { $seen_done != 16 } {
	fail "run to exit 2 (missing done messages)"
    } else {
	pass "run to exit 2"
    }
}

# The inferior program builds a tree of processes by executing a loop
# four times, calling fork at each iteration.  Thus, at each
# iteration, the total number of processes doubles; after four
# iterations, we have 16 processes.  Each process saves the results
# from its 'fork' calls, so we can tell which leaf a given process is
# by looking at which forks returned zero and which returned a pid: a
# zero means to take the child's branch; a pid means to take the
# parent's branch.

# First set gdb to follow the child.
# The result should be that each of the 4 forks returns zero.

runto_main
gdb_test_no_output "set follow-fork child"
continue_to_exit_bp_loc

gdb_test "print pids" "\\$.* = \\{0, 0, 0, 0\\}.*" "follow child, print pids"

# Now set gdb to follow the parent.
# Result should be that none of the 4 forks returns zero.

runto_main
gdb_test_no_output "set follow-fork parent" ""
continue_to_exit_bp_loc

gdb_test "print pids\[0\]==0 || pids\[1\]==0 || pids\[2\]==0 || pids\[3\]==0" \
    " = 0" "follow parent, print pids"

#
# Now test with detach-on-fork off.
#

# detach-on-fork isn't implemented on hpux.
#
if {![istarget "*-*-linux*"]} then {
    continue
}

# Start with a fresh gdb

clean_restart ${binfile}

runto_main
gdb_breakpoint $exit_bp_loc

gdb_test "help set detach-on-fork" "whether gdb will detach the child.*" \
    "help set detach"

gdb_test "show detach-on-fork" "on." "show detach default on"

gdb_test_no_output "set detach off" "set detach off"

#
# We will now run every fork up to the exit bp, 
# eventually winding up with 16 inferiors.
#

for {set i 1} {$i <= 15} {incr i} {
  gdb_test "continue" "Breakpoint .* main .*exit.*" "Run to exit $i"
  gdb_test "info inferior" " 5 .* 4 .* 3 .* 2 .*" "info inferior $i"
  gdb_test "inferior $i + 1" "(_dl_sysinfo_int80|fork|__kernel_(v|)syscall).*" \
      "inferior $i"
}

gdb_test "continue" "Breakpoint .* main .*exit.*" "Run to exit 16"
gdb_test "info inferiors" " 5 .* 4 .* 3 .* 2 .*" "info inferior 16"
gdb_test "inferior 2" " main .*" "restart final"

#
# Now we should examine all the pids.
#

# 
# Test detach inferior
# 

# [assumes we're at #1]
gdb_test "detach inferior 2" "Detaching .*" "Detach 2"
gdb_test "detach inferior 3" "Detaching .*" "Detach 3"
gdb_test "detach inferior 4" "Detaching .*" "Detach 4"
gdb_test "detach inferior 5" "Detaching .*" "Detach 5"

# 
# Test kill inferior
#

gdb_test_no_output "kill inferior 6" "Kill 6"
gdb_test "info inferior 6" "<null>.*" "Did kill 6"
gdb_test_no_output "kill inferior 7" "Kill 7"
gdb_test "info inferior 7" "<null>.*" "Did kill 7"
gdb_test_no_output "kill inferior 8" "Kill 8"
gdb_test "info inferior 8" "<null>.*" "Did kill 8"
gdb_test_no_output "kill inferior 9" "Kill 9"
gdb_test "info inferior 9" "<null>.*" "Did kill 9"
gdb_test_no_output "kill inferior 10" "Kill 10"
gdb_test "info inferior 10" "<null>.*" "Did kill 10"
gdb_test_no_output "kill inferior 11" "Kill 11"
gdb_test "info inferior 11" "<null>.*" "Did kill 11"
gdb_test_no_output "kill inferior 12" "Kill 12"
gdb_test "info inferior 12" "<null>.*" "Did kill 12"
gdb_test_no_output "kill inferior 13" "Kill 13"
gdb_test "info inferior 13" "<null>.*" "Did kill 13"
gdb_test_no_output "kill inferior 14" "Kill 14"
gdb_test "info inferior 14" "<null>.*" "Did kill 14"
gdb_test_no_output "kill inferior 15" "Kill 15"
gdb_test "info inferior 15" "<null>.*" "Did kill 15"
gdb_test_no_output "kill inferior 16" "Kill 16"
gdb_test "info inferior 16" "<null>.*" "Did kill 16"

return 0
