# Copyright (C) 2004, 2007, 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 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 2,.*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
