# Copyright 2002 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@gnu.org

# This is a regression test for gdb/568 in the sources.redhat.com
# GNATS database.  As of early June 2002, GDB could get sort of wedged
# debugging the program `killed.c':
#
# $ $D6/gdb/gdb -nw killed
# GNU gdb 2002-06-11-cvs
# Copyright 2002 Free Software Foundation, Inc.
# GDB is free software, covered by the GNU General Public License, and you are
# welcome to change it and/or distribute copies of it under certain conditions.
# Type "show copying" to see the conditions.
# There is absolutely no warranty for GDB.  Type "show warranty" for details.
# This GDB was configured as "i686-pc-linux-gnu"...
# (gdb) run
# Starting program: /home/jimb/foo/play/killed 
# [New Thread 1024 (LWP 6487)]
# [New Thread 2049 (LWP 6488)]
# [New Thread 1026 (LWP 6489)]
# Cannot find user-level thread for LWP 6487: generic error
# (gdb) quit
# The program is running.  Exit anyway? (y or n) y
# Cannot find thread 2049: generic error
# (gdb) kill
# Kill the program being debugged? (y or n) y
# Cannot find thread 2049: generic error
# (gdb) The program is running.  Exit anyway? (y or n) y
# Cannot find thread 2049: generic error
# (gdb) 
# [7]+  Stopped                 $D6/gdb/gdb -nw killed
# $ kill %7
# 
# [7]+  Stopped                 $D6/gdb/gdb -nw killed
# $ kill -9 %7
# 
# [7]+  Stopped                 $D6/gdb/gdb -nw killed
# $ 
# [7]+  Killed                  $D6/gdb/gdb -nw killed
# $ 

if $tracelevel then {
	strace $tracelevel
}

set prms_id 0
set bug_id 0

set testfile "killed"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug "incdir=${objdir}/${subdir}"]] != "" } {
    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}


gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

gdb_test "run" "" "run program to completion"

# Try to quit.
send_gdb "quit\n"
gdb_expect {
    -re "The program is running.  Exit anyway\\? \\(y or n\\) $" {
        send_gdb "y\n"
        exp_continue
    }
    eof {
        pass "GDB exits after multi-threaded program exits messily"
    }
    -re "Cannot find thread ${decimal}: generic error\[\r\n\]*$gdb_prompt $" {
        # setup_kfail "gdb/568"
        fail "GDB exits after multi-threaded program exits messily (not a regression; gdb/568)"
    }
    timeout {
        fail "GDB exits after multi-threaded program exits messily (timeout)"
    }
}
