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

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

# watch-thread_num.exp   Test thread <thread_num> parameter for
#                        watch commands.
#

# This test verifies that a watchpoint is detected in the proper thread
# so the test is only meaningful on a system with hardware watchpoints.
# More specifically, the implementation of this test uses access
# watchpoints, so skip it when those are not available.
if {[skip_hw_watchpoint_access_tests]} {
    return 0
}

standard_testfile .c

# What compiler are we using?
#
if [get_compiler_info] {
    return -1
}

if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    return -1
}

clean_restart ${binfile}

if { ![runto_main] } then {
   return
}

gdb_test "watch shared_var thread 0" "Invalid thread ID: 0" "watchpoint on invalid thread"
gdb_test "watch shared_var thread" "A syntax error in expression, near `thread'\." "invalid watch syntax"

set bpexitline [gdb_get_line_number "all threads started"]
gdb_breakpoint "$bpexitline"
gdb_continue_to_breakpoint "all threads started"

gdb_test "break loop" "Breakpoint \[0-9\].*" \
  "Set breakpoint at loop"

gdb_test "continue" ".*Breakpoint .*loop.*" "stopped in loop"

gdb_test_multiple "thread" "thread command" {
    -re ".*Current thread is (\[0-9\]*).*$gdb_prompt $" {
	pass "thread command"
    }
}

set thread_num "$expect_out(1,string)"

delete_breakpoints

# We use an access watchpoint rather than a write watchpoint, because
# GDB can drop the latter when multiple threads trigger events
# simultaneously, on targets with continuable watchpoints, such as
# x86.  See PR breakpoints/10116.

gdb_test "awatch shared_var thread $thread_num" \
    "Hardware access \\(read/write\\) watchpoint .*: shared_var.*" \
    "watchpoint on shared variable"

gdb_test "info breakpoint \$bpnum" \
    "stop only in thread $thread_num" \
    "info breakpoint shows watchpoint is thread-specific"

# Uncomment to see additional information.
#gdb_test "set debug infrun 1"

for {set i 1} {$i <= 5} {incr i} {
    set watchpoint "Watchpoint triggered iteration $i"
    set check "Check thread that triggered iteration $i"

    set test $watchpoint
    set seen_watchpoint 0
    gdb_test_multiple "continue" $test {
	-re "Hardware access \\(read/write\\) watchpoint .*: shared_var" {
	    set seen_watchpoint 1
	    exp_continue
	}
	-re "$gdb_prompt " {
	    if { $seen_watchpoint } {
		pass $test
	    } else {
		fail $test
	    }
	}
	-re "\\\[infrun\\\] " {
	    # Avoid timeouts when debugging GDB.
	    exp_continue
	}
    }
    gdb_test "thread" ".*Current thread is $thread_num .*" $check
}

