# Copyright (C) 2015-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/>.

# This test exercises the case of stopping for a breakpoint hit of one
# thread, then switching to a thread that has a status pending and
# continuing.

if [target_info exists gdb,nointerrupts] {
    verbose "Skipping continue-pending-status.exp because of nointerrupts."
    return
}

standard_testfile

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

if ![runto_main] {
    return -1
}

set break_line [gdb_get_line_number "break here"]

# Return current thread's number.

proc get_current_thread {} {
    global gdb_prompt

    set thread ""
    set msg "get thread number"
    gdb_test_multiple "print /x \$_thread" $msg {
	-re "\\$\[0-9\]* = (0x\[0-9a-zA-Z\]+).*$gdb_prompt $" {
	    set thread $expect_out(1,string)
	    pass "$msg"
	}
    }
    return ${thread}
}

# There are two threads in the program that are running the same tight
# loop, where we place a breakpoint.  Sometimes we'll get a breakpoint
# trigger for thread 2, with the breakpoint event of thread 3 pending,
# other times the opposite.  The original bug that motivated this test
# depended on the event thread being the highest numbered thread.  We
# try the same multiple times, which should cover both threads
# reporting the event.

set attempts 20

# These track whether we saw events for both threads 2 and 3.  If the
# backend always returns the breakpoint hit for the same thread, then
# it fails to make sure threads aren't starved, and we'll fail the
# assert after the loop.
set saw_thread_2 0
set saw_thread_3 0

for {set i 0} {$i < $attempts} {incr i} {
    with_test_prefix "attempt $i" {
	gdb_test "b $srcfile:$break_line" \
	    "Breakpoint .* at .*$srcfile, line $break_line.*" \
	    "set break in tight loop"
	gdb_test "continue" \
	    "$srcfile:$break_line.*" \
	    "continue to tight loop"

	# Switch to the thread that did _not_ report the event (and
	# thus may have a pending status).  At the time this test was
	# written this was necessary to make linux-nat.c short-circuit
	# the resume and go straight to consuming the pending event.
	set thread [get_current_thread]
	if {$thread == 2} {
	    incr saw_thread_2
	    set thread 3
	} else {
	    incr saw_thread_3
	    set thread 2
	}
	gdb_test "thread $thread" \
	    "Switching to thread $thread .*" \
	    "switch to non-event thread"

	# Delete all breakpoints so that continuing doesn't switch
	# back to the event thread to do a step-over, which would mask
	# away the original bug, which depended on the event thread
	# still having TARGET_STOPPED_BY_SW_BREAKPOINT stop_reason.
	delete_breakpoints

	# In the original bug, continuing would trigger an internal
	# error in the linux-nat.c backend.

	set msg "continue for ctrl-c"
	gdb_test_multiple "continue" $msg {
	    -re "Continuing" {
		pass $msg
	    }
	}

	# Wait a bit for GDB to give the terminal to the inferior,
	# otherwise ctrl-c too soon can result in a "Quit".
	sleep 1
	send_gdb "\003"

	set msg "caught interrupt"
	gdb_test_multiple "" $msg {
	    -re "Thread .* received signal SIGINT.*$gdb_prompt $" {
		pass $msg
	    }
	}
    }
}

verbose -log "saw_thread_2=$saw_thread_2"
verbose -log "saw_thread_3=$saw_thread_3"

gdb_assert {$saw_thread_2 > 0 && $saw_thread_3 > 0} "no thread starvation"
