# Copyright (C) 2004, 2007, 2008 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

if $tracelevel then {
	strace $tracelevel
}

set testfile "hand-call-in-threads"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug "incdir=${objdir}" "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

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

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${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 "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 "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 of scheduler locking.
gdb_test "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
