# Copyright (C) 2004 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 Manoj Iyer. (manjo@austin.ibm.com)
# Test break points and single step on thread functions.
# 
# Test Purpose:
# - Test that breakpoints, continue in a threaded  application works. 
#   On powerpc64-unknown-linux-gnu system, running kernel version
#   2.6.5-7.71-pseries64 this test is known to fail due to kernel bug
#   in ptrace system call.
#
# Test Strategy:
# - thread_check.c creates 2 threads
# - start gdb 
# - create 2 breakpoints #1 main() #2 tf() (the thread function)
# - run gdb till #1 main() breakpoint is reached
# - continue to breakpoint #2 tf()
# - delete all breakpoints 
# - exit gdb.

if $tracelevel then {
        strace $tracelevel
}

set prms_id 0
set bug_id 0

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

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


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

if ![runto_main] then {
   fail "Can't run to main"
      return 1;
}


#
# set breakpoint at thread fucntion tf
#
gdb_test "break tf" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "breakpoint at tf"


#
#
# continue to tf() breakpoint #2
#
gdb_test "continue" \
     ".*Breakpoint .*tf.*at.*$srcfile:.*" \
     "continue to tf"

#   
# backtrace from thread function.
#
gdb_test "backtrace" \
    "#0 .*tf .*at .*$srcfile:.*" \
    "backtrace from thread function"


#
# delete all breakpoints
#
delete_breakpoints

#
# exit gdb
#
gdb_exit
