# Copyright (C) 2008-2012 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/>.

# Test handling of threads across an execl.

if { [is_remote target] } then {
    continue
}

# Original image, loads a thread library.
set testfile "execl"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

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

# New image, that does not load a thread library.
set testfile1 "execl1"
set srcfile1 ${testfile1}.c
set binfile1 ${objdir}/${subdir}/${testfile1}

if {[gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile1}" executable {debug}] != "" } {
    return -1
}

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

runto_main

gdb_test "b [gdb_get_line_number "breakpoint here"]" \
         ".*Breakpoint .*execl.*" "set breakpoint at execl"

gdb_test "continue" ".*breakpoint here.*" "continue to exec"

gdb_test "info threads" ".*3 *Thread.*2 *Thread.*1 *Thread.*" "info threads before exec"

# When continuing from this point we'll hit the breakpoint in main()
# again, this time in the exec'd process.
gdb_test "continue" ".*Breakpoint 1, main.*" \
    "continue across exec"

gdb_test "info threads" ".*" "info threads after exec"

set test "info threads after exec"
gdb_test_multiple "info threads" "$test" {
    -re "2 *Thread .*$gdb_prompt $" {
	# Old threads left behind.
	fail "$test"
    }
    -re "4 *Thread .*$gdb_prompt $" {
	# New threads registered.
	fail "$test"
    }
    -re "$gdb_prompt $" {
	# Target doesn't register the main thread, pass for now.
	pass "$test"
    }
}

gdb_continue_to_end
