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

# Copyright 2009, 2010, 2011 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"
