# 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 recovering from a hand function call that gets interrupted
# by a signal in another thread.

set NR_THREADS 4

if $tracelevel then {
	strace $tracelevel
}

set testfile "interrupted-hand-call"
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
}

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"

# 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"

# NOTE: Don't turn on scheduler-locking here.
# We want the main thread (hand_call_with_signal) and
# thread 1 (sigabrt_handler) to both run.

gdb_test "call hand_call_with_signal()" \
    ".*in another thread.*" \
    "hand-call interrupted by signal in another thread"

# Verify dummy stack frame is still present.

gdb_test "maint print dummy-frames" ".*stack=.*" "dummy stack frame present"

# Continuing now should exit the hand-call and pop the dummy frame.

gdb_test "continue" "" "finish hand-call"

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

# Continue one last time, the program should exit normally.

gdb_test "continue" "Program exited normally." \
    "continue to program exit"

return 0
