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

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

# This file verifies that GDB is able to compute a backtrace for a thread
# being blocked on a call to pthread_cond_wait(). 

if $tracelevel then {
	strace $tracelevel
}

set testfile "pthread_cond_wait"
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_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
runto_main

gdb_test "break break_me" \
    "Breakpoint 2 at .*: file .*${srcfile}, line .*" \
         "breakpoint on break_me"

gdb_test "continue" \
         ".*Breakpoint 2, break_me ().*" \
         "run to break_me"

# 
# Backtrace all threads, find the one running noreturn, and
# verify that we are able to get a sensible backtrace, including
# the frame for the pthread_cond_wait() call.
#
# The string below will only match if the functions named
# occur in a single thread's backtrace, in the given order.
#

global hex
global decimal

#
# This is a "backtrace break" ("btb"):
#
set btb "\[^\r\n\]+\[\r\n\]+\#${decimal}\[ \t\]+${hex} in "

# One of the threads is blocked on a call to pthread_cond_wait, and
# we want to verify that we are able to get a sensible backtrace for
# that thread.  Because we don't know its thread ID, we can't switch
# to it before doing the backtrace. So we get a backtrace for all
# threads, and verify that one them returns the expected backtrace.
gdb_test "thread apply all backtrace" \
    "pthread_cond_wait${btb}cond_wait${btb}noreturn${btb}forever_pthread.*" \
    "backtrace in blocked thread"

