# Copyright 2010-2012 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/>.

standard_testfile
set executable ${testfile}

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

clean_restart $testfile

if ![runto_main] {
    return -1
}

# `nostop noprint pass' could in some cases report false PASS due to
# the (preempt 'handle') code path in linux-nat.c.

gdb_test "handle SIGUSR1 stop print pass" \
    "Signal\[ \t\]+Stop\[ \t\]+Print\[ \t\]+Pass to program\[ \t\]+Description\r\nSIGUSR1\[ \t\]+Yes\[ \t\]+Yes\[ \t\]+Yes\[ \t\].*"
gdb_test "handle SIGUSR2 stop print pass" \
    "Signal\[ \t\]+Stop\[ \t\]+Print\[ \t\]+Pass to program\[ \t\]+Description\r\nSIGUSR2\[ \t\]+Yes\[ \t\]+Yes\[ \t\]+Yes\[ \t\].*"

gdb_breakpoint [gdb_get_line_number "break-at-exit"]

set test "get pid"
gdb_test_multiple "p getpid ()" $test {
    -re " = (\[0-9\]+)\r\n$gdb_prompt $" {
	set pid $expect_out(1,string)
	pass $test
    }
}

for {set sigcount 0} {$sigcount < 4} {incr sigcount} {
    set test "catch signal $sigcount"
    set sigusr ""
    gdb_test_multiple "continue" $test {
	-re "Program received signal SIGUSR(\[12\]), User defined signal \[12\]\\.\r\n.*\r\n$gdb_prompt $" {
	    set sigusr $expect_out(1,string)
	    pass $test
	}
    }
    if {$sigusr == ""} {
	return -1
    }

    set test "signal $sigcount si_signo"
    if {$sigusr == 1} {
	set signo 10
    } else {
	set signo 12
    }
    gdb_test_multiple {p $_siginfo.si_signo} $test {
	-re " = $signo\r\n$gdb_prompt $" {
	    pass $test
	}
	-re "Attempt to extract a component of a value that is not a structure\\.\r\n$gdb_prompt $" {
	    unsupported $test
	}
    }

    set test "signal $sigcount si_code is SI_TKILL"
    gdb_test_multiple {p $_siginfo.si_code} $test {
	-re " = -6\r\n$gdb_prompt $" {
	    pass $test
	}
	-re "Attempt to extract a component of a value that is not a structure\\.\r\n$gdb_prompt $" {
	    unsupported $test
	}
    }

    set test "signal $sigcount si_pid"
    gdb_test_multiple {p $_siginfo._sifields._kill.si_pid} $test {
	-re " = $pid\r\n$gdb_prompt $" {
	    pass $test
	}
	-re "Attempt to extract a component of a value that is not a structure\\.\r\n$gdb_prompt $" {
	    unsupported $test
	}
    }
}

gdb_continue_to_breakpoint break-at-exit ".*break-at-exit.*"
