#   Copyright 2005-2012 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
}


set testfile "multi-forks"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

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

# Start with a fresh gdb

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${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

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${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
