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

# Test making hand function calls in multiple threads.

set NR_THREADS 4

standard_testfile

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

# Some targets can't do function calls, so don't even bother with this
# test.
if [target_info exists gdb,cannot_call_functions] {
    setup_xfail "*-*-*" 2416
    fail "This target can not call functions"
    continue
}

proc get_dummy_frame_number { } {
    global gdb_prompt

    gdb_test_multiple "bt" "" {
	-re "#(\[0-9\]*) *<function called from gdb>.*$gdb_prompt $" {
	    return $expect_out(1,string)
	}
	-re "$gdb_prompt $" {
	    return ""
	}
	timeout {
	    return ""
	}
    }
    return ""
}

clean_restart ${binfile}

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

gdb_test "break all_threads_running" \
         "Breakpoint 2 at .*: file .*${srcfile}, line .*" \
         "breakpoint on all_threads_running"

gdb_test "break hand_call" \
         "Breakpoint 3 at .*: file .*${srcfile}, line .*" \
         "breakpoint on hand_call"

# Run the program and make sure GDB reports that we stopped after
# hitting breakpoint 2 in all_threads_running().

gdb_test "continue" \
         ".*Breakpoint 2, all_threads_running ().*" \
         "run to all_threads_running"

# Before we start making hand function calls, turn on scheduler locking.

gdb_test_no_output "set scheduler-locking on" "enable scheduler locking"
gdb_test "show scheduler-locking" ".* locking scheduler .* is \"on\"." "show scheduler locking on"

# Now hand-call a function in each thread, having the function
# stop without returning.

# Add one for the main thread.
set total_nr_threads [expr $NR_THREADS + 1]

# Thread numbering in gdb is origin-1, so begin numbering at 1.
for { set i 1 } { $i <= $total_nr_threads } { incr i } {
    set thread_nr $i
    gdb_test "thread $thread_nr" ".*" \
	"prepare to make hand call, thread $thread_nr"
    gdb_test "call hand_call()" "Breakpoint 3, .*" \
	"hand call, thread $thread_nr"
}

# Now have each hand-called function return.

# Turn confirmation off for the "return" command.
gdb_test_no_output "set confirm off"

clear_xfail "*-*-*"

for { set i 1 } { $i <= $total_nr_threads } { incr i } {
    set thread_nr $i
    gdb_test "thread $thread_nr" ".*" \
	"prepare to discard hand call, thread $thread_nr"
    set frame_number [get_dummy_frame_number]
    if { "$frame_number" == "" } {
	fail "dummy stack frame number, thread $thread_nr"
	# Need something.
	set frame_number 0
    } else {
	pass "dummy stack frame number, thread $thread_nr"
    }
    # Pop the dummy frame.
    gdb_test "frame $frame_number" ".*" "setting frame, thread $thread_nr"
    gdb_test "return" ".*" "discard hand call, thread $thread_nr"
    # In case getting the dummy frame number failed, re-enable for next iter.
    clear_xfail "*-*-*"
}

# Make sure all dummy frames got popped.

gdb_test_multiple "maint print dummy-frames" "all dummies popped" {
    -re ".*stack=.*$gdb_prompt $" {
	fail "all dummies popped"
    }
    -re ".*$gdb_prompt $" {
	pass "all dummies popped"
    }
}

# Before we resume the full program, turn off scheduler locking.
gdb_test_no_output "set scheduler-locking off" "disable scheduler locking"
gdb_test "show scheduler-locking" ".* locking scheduler .* is \"off\"." "show scheduler locking off"

# Continue one last time, the program should exit normally.
#
# ??? This currently doesn't work because gdb doesn't know how to singlestep
# over reported breakpoints that weren't in the last thread to run.
# Commented out until then.
#
# For reference sake ...
# An alternative is to manually work around the issue by manually setting
# the thread back to the first thread: the program is still at the
# all_threads_running breakpoint, which wasn't the last thread to run,
# and gdb doesn't know how to singlestep over reported breakpoints that
# weren't in the last thread to run.
#gdb_test "thread 1" ".*" "set thread to 1, prepare to resume"
#
#gdb_continue_to_end "hand-call-in-threads"

return 0
