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

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

# This test verifies that a local watchpoint isn't deleted when a
# thread other than the thread the local watchpoint was set in stops
# for a breakpoint.

if [target_info exists gdb,no_hardware_watchpoints] {
    return 0;
}

set testfile "local-watch-wrong-thread"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if {[gdb_compile_pthreads \
	 "${srcdir}/${subdir}/${srcfile}" \
	 "${binfile}" executable {debug} ] != "" } {
    return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

gdb_test "set can-use-hw-watchpoints 1" "" ""

if ![runto_main] then {
    fail "Can't run to main"
    return
}

set inc_line_1 [gdb_get_line_number "Loop increment 1"]
set inc_line_2 [gdb_get_line_number "Loop increment 2"]
set bkpt_here [gdb_get_line_number "set breakpoint here"]

# Run to the loop within thread_function0, so we can set our local
# watchpoint.
gdb_test "break ${srcfile}:${inc_line_1}" \
    "Breakpoint 2 at .*: file .*${srcfile}, line .*" \
    "breakpoint on thread_function0"

gdb_test "continue" \
    ".*Breakpoint 2.*thread_function0.*" \
    "continue to thread_function0"

delete_breakpoints

# Set the local watchpoint, and confirm that it traps as expected.
gdb_test "watch *myp" \
    "Hardware watchpoint 3\: \\*myp.*" \
    "set local watchpoint on *myp"

gdb_test "continue" \
    "Hardware watchpoint.*Old value.*New value.*thread_function0.*" \
    "local watchpoint triggers"

delete_breakpoints

# Recreate the watchpoint, but this time with a condition we know
# won't trigger.  This is so the watchpoint is inserted, and the
# target reports events, but GDB doesn't stop for them.  We want to
# hit the breakpoints on the other thread, and make sure this
# watchpoint isn't deleted then.
gdb_test "watch *myp if trigger != 0" \
    "Hardware watchpoint 4\: \\*myp.*" \
    "set local watchpoint on *myp, with false conditional"

# Run to a breakpoint on a different thread.  The previous local
# watchpoint should not be deleted with the standard 'the program has
# left the block in which its expression is valid', because the
# thread_function0 thread should still be running in the loop.
gdb_test "break ${srcfile}:${inc_line_2}" \
    "Breakpoint 5 at .*: file .*${srcfile}, line .*" \
    "breakpoint on the other thread"

gdb_test "continue" \
    "Breakpoint 5, thread_function1.*" \
    "the other thread stopped on breakpoint"

# Delete the new breakpoint, we don't need it anymore.
gdb_test "delete 5" "" ""

# Check if the local watchpoint hasn't been deleted (is still listed).
# This is simpler to check than expecting 'the program has left ...',
# and, is immune to string changes in that warning.
gdb_test "info breakpoints" \
    ".*4.*hw watchpoint.*keep.*y.*\\*myp.*" \
    "local watchpoint is still in breakpoint list"

# Make the watchpoint condition eval true.
gdb_test "set trigger=1" "" "let local watchpoint trigger"

gdb_test "continue" \
    "Hardware watchpoint.*Old value.*New value.*thread_function0.*" \
    "local watchpoint still triggers"

# Confirm that the local watchpoint is indeed deleted when
# thread_function0 returns.
gdb_test "set *myp=0" "" "let thread_function0 return"

gdb_test "break ${srcfile}:${bkpt_here}" \
    "Breakpoint 6 at .*: file .*${srcfile}, line .*" \
    "breakpoint on thread_function0's caller"

gdb_test "continue" \
    ".*Watchpoint.*deleted.*" \
    "local watchpoint automatically deleted"
