# Copyright 2009-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 that when a thread other than the main thread execs, and the
# main thread was stopped due to user request, the new incarnation of
# the main thread doesn't just silently stop at the first internal
# breakpoint (usually the _dl_debug_state breakpoint).

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

if { ![support_displaced_stepping] } { 
    unsupported "displaced stepping"
    return -1
}

load_lib mi-support.exp
set MIFLAGS "-i=mi"

gdb_exit
if {[mi_gdb_start]} {
    continue
}

#
# Start here
#
standard_testfile nsthrexec.c

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

mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_load $binfile

mi_gdb_test "-gdb-set non-stop 1" ".*"
mi_gdb_test "-gdb-set target-async 1" ".*"
mi_detect_async

if { [mi_run_to_main] < 0 } {
    continue
}

mi_create_breakpoint thread_execler 2 keep thread_execler .* .* .* \
    "breakpoint at thread_execler"

# All threads should stop, except the main thread.
mi_send_resuming_command "exec-continue --all" "resume all"
mi_expect_stop "breakpoint-hit" "thread_execler" "\[^\n\]*" "$srcfile" \
    "\[0-9\]*" {"" "disp=\"keep\""} "stop at thread_execler"

mi_check_thread_states \
    {"running" "stopped"} \
    "thread state, execler stopped, main running"

mi_gdb_test "200-exec-interrupt --thread 1" "200\\^done" "interrupt main thread"
mi_expect_interrupt "main thread interrupted"

mi_check_thread_states {"stopped" "stopped"} "thread state, all stopped"

# now that we know about all the threads, we can get rid of the breakpoints
mi_delete_breakpoints

mi_create_breakpoint main 3 keep main .* .* .* \
    "breakpoint at main"

# Now resume the execler thread.  Eventually, it execs.
mi_send_resuming_command "exec-continue --thread 2" "resume execler thread"

# Check that the main thread passes by the _dl_debug_state internal
# breakpoint without silently stopping.
mi_expect_stop "breakpoint-hit" "main" "\[^\n\]*" "$srcfile" \
    "\[0-9\]*" {"" "disp=\"keep\""} "stop at main after exec"

mi_gdb_exit
