# This testcase is part of GDB, the GNU debugger.

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

# There's no support for vfork events in the remote protocol.
if { [is_remote target] } {
    return 0
}

global srcfile
set testfile "watch-vfork"
if { [build_executable ${testfile}.exp ${testfile} ${testfile}.c {debug}] } {
    untested ${testfile}.exp
    return -1
}

proc test_watchpoint_across_vfork { hw teststr } {
    global testfile

    clean_restart ${testfile}

    if { ![runto main] } then {
	fail "run to main ($teststr)"
	return
    }

    if { ! $hw } {
	gdb_test_no_output "set can-use-hw-watchpoints 0" ""
    }

    gdb_test "watch global" \
	"atchpoint .*: global" \
	"Watchpoint on global variable ($teststr)"

    gdb_test "continue" \
	"atchpoint .*: global.*" \
	"Watchpoint triggers after vfork ($teststr)"
}

if { ![target_info exists gdb,no_hardware_watchpoints] } {
    test_watchpoint_across_vfork 1 "hw"
}

test_watchpoint_across_vfork 0 "sw"
