# Copyright 2008, 2009, 2010, 2011 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/>.

# This test was created by modifying attach-stopped.exp.
# This file was created by Jan Kratochvil <jan.kratochvil@redhat.com>.

# This test only works on Linux
if { ![isnative] || [is_remote host] || ![istarget *-linux*] } {
    continue
}

set testfile "attach-into-signal"
set srcfile  ${testfile}.c
set binfile  ${objdir}/${subdir}/${testfile}
set escapedbinfile  [string_to_regexp ${objdir}/${subdir}/${testfile}]

remote_exec build "rm -f ${binfile}"
# For debugging this test
#
#log_user 1

proc corefunc { threadtype } {
    global srcfile
    global binfile
    global escapedbinfile
    global srcdir
    global subdir
    global gdb_prompt

    if [get_compiler_info ${binfile}] {
	return -1
    }

    # Start the program running and then wait for a bit, to be sure
    # that it can be attached to.
    # Statistically there is a better chance without giving process a nice.

    set testpid [eval exec $binfile &]
    exec sleep 2

    # Run 2 passes of the test.
    # The C file inferior stops pending its signals if a single one is lost,
    # we test successful redelivery of the caught signal by the 2nd pass.

    # linux-2.6.20.4.x86_64 had maximal attempt # 20 in 4 test runs.
    set attempts 100
    set attempt 1
    set passes 1
    while { $passes < 3 && $attempt <= $attempts } {
	set stoppedtry 0
	while { $stoppedtry < 10 } {
	    if [catch {open /proc/${testpid}/status r} fileid] {
		set stoppedtry 10
		break
	    }
	    gets $fileid line1;
	    gets $fileid line2;
	    close $fileid;

	    if {![string match "*(stopped)*" $line2]} {
		# No PASS message as we may be looping in multiple attempts.
		break
	    }
	    sleep 1
	    set stoppedtry [expr $stoppedtry + 1]
	}
	if { $stoppedtry >= 10 } {
	    verbose -log $line2
	    set test "$threadtype: process is still running on the attempt # $attempt of $attempts"
	    break
	}

	# Main test:
	set test "$threadtype: attach (pass $passes), pending signal catch"
	if {[gdb_test_multiple "attach $testpid" $test {
	    -re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*Received Alarm clock.*$gdb_prompt $" {
		# nonthreaded:
		pass $test
		verbose -log "$test succeeded on the attempt # $attempt of $attempts"
		set passes [expr $passes + 1]
	    }
	    -re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*$gdb_prompt $" {
		# nonthreaded:
		# We just lack the luck, we should try it again.
		set attempt [expr $attempt + 1]
	    }
	    -re "Attaching to process $testpid.*Received Alarm clock.*$gdb_prompt $" {
		# threaded:
		pass $test
		verbose -log "$test succeeded on the attempt # $attempt of $attempts"
		set passes [expr $passes + 1]
	    }
	    -re "Attaching to process $testpid.*$gdb_prompt $" {
		# threaded:
		# We just lack the luck, we should try it again.
		set attempt [expr $attempt - 1]
	    }
	}] != 0 } {
	    break
	}

	gdb_test "detach" "Detaching from.*" ""
    }
    if {$passes < 3} {
	if {$attempt > $attempts} {
	    unresolved $test
	} else {
	    fail $test
	}
    }

    # Exit and detach the process.
       
    gdb_exit

    # Make sure we don't leave a process around to confuse
    # the next test run (and prevent the compile by keeping
    # the text file busy), in case the "set should_exit" didn't
    # work.

    # Continue the program - some Linux kernels need it before -9 if the
    # process is stopped.
    remote_exec build "kill -s CONT ${testpid}"
       
    remote_exec build "kill -9 ${testpid}"
}

# Start with clean gdb
gdb_exit

# build the test case first without threads
#
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested "attach-into-signal.exp (unthreaded)"
    return -1
}

gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
gdb_test_no_output "set debug lin-lwp 1" ""

corefunc nonthreaded

# build the test case also with threads
#
if  { [gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DUSE_THREADS}] != "" } {
    untested "attach-into-signal.exp (threaded)"
    return -1
}

gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
gdb_test_no_output "set debug lin-lwp 1" ""

corefunc threaded
