# Copyright (C) 2019-2021 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/>.  */

# Test following a vfork child that exits, when the vfork parent is a
# threaded program, and it's a non-main thread that vforks.

standard_testfile

if {[build_executable "failed to prepare" $testfile $srcfile {debug pthreads}]} {
    return -1
}

# DETACH indicates whether "set detach-on-fork" is enabled.  It is
# either "on" or "off".

proc test_vfork {detach} {
    global binfile

    clean_restart $binfile

    if ![runto_main] then {
	return 0
    }

    gdb_test_no_output "set follow-fork-mode child"
    gdb_test_no_output "set detach-on-fork $detach"

    if {$detach == "off"} {
	gdb_test "continue" \
	    [multi_line \
		 "Attaching after .* vfork to child .*" \
		 ".*New inferior 2 .*" \
		 ".*Inferior 2 .*exited normally.*"]
    } else {
	gdb_test "continue" \
	    [multi_line \
		 "Attaching after .* vfork to child .*" \
		 ".*New inferior 2 .*" \
		 ".*Detaching vfork parent process .* after child exit.*" \
		 ".*Inferior 1 .* detached.*" \
		 ".*Inferior 2 .*exited normally.*"]
    }
}

foreach_with_prefix detach-on-fork {"off" "on"} {
    test_vfork ${detach-on-fork}
}
