# Copyright (C) 2008, 2010 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 use of unwindonsignal when 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.

# Do turn on unwindonsignal.
# We want to test gdb handling of the current thread changing when
# unwindonsignal is in effect.
gdb_test_no_output "set unwindonsignal on" \
	"setting unwindonsignal"
gdb_test "show unwindonsignal" \
	"Unwinding of stack .* is on." \
	"showing unwindonsignal"

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

# Verify dummy stack frame is still present.
# ??? Should unwindonsignal still apply even if the program stops
# because of a signal in another thread?

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

# GDB 6.8 would perform the unwindonsignal, but on the thread that stopped,
# not the thread with the hand-called function.
# This is tested by verifying only one thread has main in its backtrace.

gdb_test_multiple "thread apply all bt" "wrong thread not unwound" {
    -re ".* in main .* in main .*$gdb_prompt $" {
	fail "wrong thread not unwound"
    }
    -re ".* in main .*$gdb_prompt $" {
	pass "wrong thread not unwound"
    }
}

# 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
