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

# This only works with native configurations
if {![isnative]} {
  return
}

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

gdb_exit
if {[mi_gdb_start]} {
    continue
}

#
# Start here
#
set testfile "nsmoribund"
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
send_gdb "-gdb-show non-stop\n"
gdb_expect {
    -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

mi_gdb_test "200-break-insert -t main" ".*"

set created "=thread-created,id=\"$decimal\"\r\n"
set running "\\*running,thread-id=\"$decimal\"\r\n"

set notifs "($created)*($running)*"

# Note: presently, we skip this test on non-native targets,
# so 'run' is OK.  As soon as we start to run this on remote
# target, the logic from mi_run_cmd will have to be refactored.
send_gdb "-exec-run\n"
gdb_expect {
    -re "\\^running\r\n$notifs$mi_gdb_prompt" {
    }
    -re "\\^error,msg=\"The target does not support running in non-stop mode.\"" {
	verbose -log "Non-stop mode not supported, skipping all tests"
	return
    }
    -re "\r\n$mi_gdb_prompt" {
	perror "Cannot start target (unknown output after running)"
	return -1
    }
    timeout {
	perror "Cannot start target (timeout)"
	return -1
    }
}
mi_expect_stop "breakpoint-hit" main ".*" ".*" "\[0-9\]+" \
    { "" "disp=\"del\"" } "run to main"

# Keep this in sync with THREADS in the the $srcfile.
set nthreads 10

# Set a breakpoint and let all threads hit it (except the main
# thread).

set bkpt_line [gdb_get_line_number "set breakpoint here"]

mi_create_breakpoint "$srcfile:$bkpt_line" 2 keep thread_function .* .* .* \
    "breakpoint at thread_function"

mi_send_resuming_command "exec-continue --all" "resume all"
for {set i 0} {$i < $nthreads} {incr i} {
    mi_expect_stop "breakpoint-hit" "thread_function" "\[^\n\]*" "$srcfile" \
	"\[0-9\]*" {"" "disp=\"keep\""} "stop $i"
}

# All but the main thread should have hit it.

mi_check_thread_states \
    {"running" "stopped" "stopped" "stopped" "stopped" "stopped" "stopped" "stopped" "stopped" "stopped" "stopped"} \
    "thread state: all stopped except the main thread"

# Select a stopped thread to make sure we're able to delete
# breakpoints
mi_gdb_test "-thread-select 5" "\\^done.*" "select thread 5"

# Now that we know about all the threads, we can get rid of
# breakpoint.
mi_delete_breakpoints

# Recreate the same breakpoint, but this time, specific to thread 5.
mi_create_breakpoint "-p 5 $srcfile:$bkpt_line" 3 keep thread_function .* .* .* \
    "thread specific breakpoint at thread_function"

# Resume all threads.  Only thread 5 should report a stop.

set running_re ""
for {set i $nthreads} {$i > 0} {incr i -1} {
    set running_re "$running_re\\*running,thread-id=\"$decimal\"\r\n"
}

send_gdb "-exec-continue --all\n"
gdb_expect {
    -re ".*$running_re$mi_gdb_prompt" {
	pass "resume all, thread specific breakpoint"
    }
    timeout {
	fail "resume all, thread specific breakpoint (timeout)"
    }
}

mi_expect_stop "breakpoint-hit" "thread_function" "\[^\n\]*" "$srcfile" \
    "\[0-9\]*" {"" "disp=\"keep\""} "hit thread specific breakpoint"

# All threads except both thread 5 (and the main thread) should now be
# repeatedly hitting the thread specific breakpoint and stepping over
# it transparently.  These are internal events, so the frontend should
# see those threads as running.

mi_check_thread_states \
    {"running" "running" "running" "running" "stopped" "running" "running" "running" "running"} \
    "thread state: all running except the breakpoint thread"

# Get rid of the breakpoint while the other threads are stepping over
# it, and tell all threads to exit.  The program should exit
# gracefully shortly.  Send all commands in a row, since if something
# goes wrong with moribund locations support or displaced stepping (or
# a target bug if it can step over breakpoints itself), a spurious
# SIGTRAP/SIGSEGV can come at any time after deleting the breakpoint.

send_gdb "102-break-delete\n"
send_gdb "print done = 1\n"
send_gdb "103-exec-continue --all\n"

gdb_expect {
    -re "\\*stopped,reason=\"exited-normally\"" {
	pass "resume all, program exited normally"
    }
    -re "\\*stopped" {
	fail "unexpected stop"
    }
    timeout {
	fail "resume all, waiting for program exit (timeout)"
    }
}

mi_gdb_exit
