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

# Are we on a target board?  And non-Linux targets seem to identify the thread
# differently.
if {![isnative] || ![istarget "*-*-linux*"]} {
    return
}

set testfile "corethreads"
set srcfile ${testfile}.c
set executable ${testfile}
set binfile ${objdir}/${subdir}/${executable}
if { [gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested ${testfile}.exp
     return -1
}

set corefile [core_find $binfile]
if {$corefile == ""} {
    return 0
}

clean_restart $executable

gdb_test "core-file $corefile" "Core was generated by .*" "load core"
gdb_test "info files" "\r\nLocal core dump file:\r\n.*" "sanity check we see the core file"

set test "print pthread_t of thread0"
gdb_test_multiple "p/x thread0" $test {
    -re " = (0x\[0-9a-f\]+)\r\n$gdb_prompt $" {
	pass $test
	set thread0 $expect_out(1,string)
    }
}
set test "print pthread_t of thread1"
gdb_test_multiple "p/x thread1" $test {
    -re " = (0x\[0-9a-f\]+)\r\n$gdb_prompt $" {
	pass $test
	set thread1 $expect_out(1,string)
    }
}

gdb_test "info threads" "\r\n *\[12\] +Thread $thread0 .*" "thread0 found"
gdb_test "info threads" "\r\n *\\*? +\[12\] +Thread $thread1 .*" "thread1 found"
gdb_test "info threads" "\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n\[^\r\n\]+\r\n\[^\r\n\]+" "no other thread found"
