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

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

gdb_exit
if {[mi_gdb_start]} {
    continue
}

#
# Start here
#
set testfile "nsthrexec"
set srcfile "$testfile.c"
set binfile "$objdir/$subdir/mi-$testfile"

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

mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_load $binfile

set supported 0
gdb_test_multiple "-gdb-show non-stop" "" {
    -re ".*\\^done,value=\"off\",supported=\"(\[^\"\]+)\"\r\n$mi_gdb_prompt$" {
	if { $expect_out(1,string) == "1" } {
	    set supported 1
	}
    }
    -re ".*$mi_gdb_prompt$" {
    }
}

mi_gdb_test "-gdb-set non-stop 1" ".*"
mi_gdb_test "-gdb-set target-async 1" ".*"
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
