# Copyright (C) 1996, 1997, 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@prep.ai.mit.edu

# This file was written by Daniel Jacobowitz <drow@mvista.com>
# (parts based on pthreads.exp by Fred Fish (fnf@cygnus.com).
#
# It tests miscellaneous actions with multiple threads, including
# handling for thread exit.

if $tracelevel then {
	strace $tracelevel
}

set prms_id 0
set bug_id 0

set testfile "print-threads"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

# regexp for "horizontal" text (i.e. doesn't include newline or
# carriage return)
set horiz "\[^\n\r\]*"

set built_binfile 0

# Default to the usual (only?) -lpthread on GNU/Linux to quiet noise
if [istarget "*-*-linux*"] then {
    set possible_libs "-lpthread -lpthreads -lthread"
} else {
    set possible_libs "-lpthreads -lpthread -lthread"
}

set why_msg "unrecognized error"
foreach lib $possible_libs {
    set options "debug"
    lappend options "incdir=${objdir}/${subdir}"
    lappend options "libs=$lib"
    set ccout [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable $options]
    switch -regexp -- $ccout {
	".*no posix threads support.*" {
	    set why_msg "missing threads include file"
	    break
	}
	".*cannot open -lpthread.*" {
	    set why_msg "missing runtime threads library"
	}
	".*Can't find library for -lpthread.*" {
	    set why_msg "missing runtime threads library"
	}
	{^$} {
	    pass "successfully compiled posix threads test case"
	    set built_binfile 1
	    break
	}
    }
}
if {$built_binfile == "0"} {
    unsupported "Couldn't compile ${srcfile}, ${why_msg}"
    return -1
}

# Now we can proceed with the real testing.

# Start with a fresh gdb.

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

gdb_test "set print sevenbit-strings" ""
#gdb_test "set print address off" ""
gdb_test "set width 0" ""

# We'll need this when we send_gdb a ^C to GDB.  Need to do it before we
# run the program and gdb starts saving and restoring tty states.
# On Ultrix, we don't need it and it is really slow (because shell_escape
# doesn't use vfork).
if ![istarget "*-*-ultrix*"] then {
    gdb_test "shell stty intr '^C'" ""
}

proc test_all_threads { name kill } {
    global gdb_prompt

    set i 0
    set j 0
    send_gdb "continue\n"
    gdb_expect {
	-re "Breakpoint \[0-9\]+, thread_function \\(arg=.*\\) at .*print-threads.c:\[0-9\]+.*$gdb_prompt" {
	    set i [expr $i + 1]
	    pass "Hit thread_function breakpoint, $i ($name)"
	    send_gdb "continue\n"
	    exp_continue
	}
	-re "Breakpoint \[0-9\]+, .* kill \\(.*\\) .*$gdb_prompt" {
	    set j [expr $j + 1]
	    if { $kill == 1 } {
		pass "Hit kill breakpoint, $j ($name)"
	    } else {
		fail "Hit kill breakpoint, $j ($name) (unexpected)"
	    }
	    send_gdb "continue\n"
	    exp_continue
	}
	-re "Program exited normally\\.\[\r\n\]+$gdb_prompt" {
	    pass "program exited normally"
	    if {$i == 5} {
		pass "all threads ran once ($name)"
	    } else {
		fail "all threads ran once ($name) (total $i threads ran)"
	    }
	}
	-re "$gdb_prompt" {
	    fail "Running threads ($name) (unknown output)"
	}
	timeout {
	    fail "Running threads ($name) (timeout)"
	}
    }
}

runto_main
gdb_test "break thread_function" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*print-threads.c, line \[0-9\]*\\."
gdb_test "set var slow = 0" ""
test_all_threads "fast" 0

runto_main
gdb_test "break thread_function" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*print-threads.c, line \[0-9\]*\\." "break thread_function (2)"
gdb_test "set var slow = 1" ""
test_all_threads "slow" 0

runto_main
gdb_test "break thread_function" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*print-threads.c, line \[0-9\]*\\." "break thread_function (3)"
gdb_test "set var slow = 1" "" "set var slow = 1 (2)"
gdb_test "break kill" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+"
test_all_threads "slow with kill breakpoint" 1

return 0
