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

# This test was created by modifying attach.exp.
# This file was created by Jeff Johnston <jjohnstn@redhat.com>.
# This file was updated by Jan Kratochvil <jan.kratochvil@redhat.com>.

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

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

#execute_anywhere "rm -f ${binfile}"
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.

    set testpid [eval exec $binfile &]

    # Avoid some race:
    sleep 2

    # Stop the program 
    remote_exec build "kill -s STOP ${testpid}"

    # Start with clean gdb
    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load ${binfile}

    # Verify that we can attach to the stopped process.
       
    set test "$threadtype: attach2 to stopped, after setting file"
    gdb_test_multiple "attach $testpid" "$test" {
	-re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*$gdb_prompt $" {
	    pass "$test"
	}
    }

    # ".*sleep.*clone.*" would fail on s390x as bt stops at START_THREAD there.
    if {[string equal $threadtype threaded]} {
	gdb_test "thread apply all bt" ".*sleep.*start_thread.*" "$threadtype: attach2 to stopped bt"
    } else {
	gdb_test "bt" ".*sleep.*main.*" "$threadtype: attach2 to stopped bt"
    }
    # This breakpoint is there for old/non-x86 kernels not restarting syscalls.
    gdb_breakpoint [gdb_get_line_number "Second sleep"]
    set test "$threadtype: attach2 continue"
    send_gdb "continue\n"
    gdb_expect {
      -re "Continuing"
	{ pass "continue ($test)" }
      timeout
	{ fail "continue ($test) (timeout)" }
    }

    # For this to work we must be sure to consume the "Continuing."
    # message first, or GDB's signal handler may not be in place.
    after 1000 {send_gdb "\003"}
    set test "$threadtype: attach2 stop interrupt"
    gdb_expect 10 {
      -re "Program received signal SIGINT.*$gdb_prompt $"
	{
	  pass $test
	}
      -re "Breakpoint \[0-9\].*$srcfile.*$gdb_prompt $"
	{
	  pass $test
	}
      timeout
	{
	  fail $test
	}
    }

    gdb_exit

    # Avoid some race:
    sleep 2

    # At this point, the process should be sleeping

    if [catch {open /proc/${testpid}/status r} fileid2] {
	set line2 "NOTFOUND"
    } else {
	gets $fileid2 line1;
	gets $fileid2 line2;
	close $fileid2;
    }

    set test "$threadtype: attach2, exit leaves process sleeping"
    if {[string match "*(sleeping)*" $line2]} {
      pass $test
    } else {
      fail $test
    }

    # 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.
       
    remote_exec build "kill -9 ${testpid}"
}

# build the test case first without threads
#
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    gdb_suppress_entire_file "Testcase nonthraded compile failed, so all tests in this file will automatically fail."
}

corefunc nonthreaded

# build the test case first without threads
#
if  { [gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DUSE_THREADS}] != "" } {
    gdb_suppress_entire_file "Testcase threaded compile failed, so all tests in this file will automatically fail."
}

corefunc threaded

return 0
