# Copyright 2009, 2010, 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/>.

# Test that when a thread other than the main thread execs, we follow
# through to the new incarnation of the main thread.

# No exec event support in the remote protocol.
if { [is_remote target] } then {
    continue
}

set testfile "non-ldr-exc-1"
set srcfile ${testfile}.c
set executable ${testfile}
set binfile ${objdir}/${subdir}/${executable}

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

proc do_test { lock_sched } {
    global pf_prefix
    global executable

    set save_pf_prefix $pf_prefix
    lappend pf_prefix "lock-sched$lock_sched:"

    clean_restart ${executable}

    if ![runto_main] {
	set pf_prefix $save_pf_prefix
	return -1
    }

    gdb_breakpoint [gdb_get_line_number "break-here"]
    gdb_continue_to_breakpoint "break-here" ".* break-here .*"

    # Also test with sched-lock to make sure we can follow the
    # non-leader thread execing even though the main thread wasn't
    # resumed before the exec.
    if { $lock_sched } {
	gdb_test_no_output "set scheduler-locking on"
    }

    gdb_test "continue" \
	".*is executing new program.*Breakpoint 1, main.* at .*" \
	"continue over exec"

    set pf_prefix $save_pf_prefix
}

do_test 0
do_test 1
