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

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

gdb_exit
if {[mi_gdb_start]} {
    continue
}

#
# Start here
#
set testfile "nsintrall"
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

if { [mi_run_to_main] < 0 } {
    perror "mi-nsintrall.exp tests suppressed"
    continue
}

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

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

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

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

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

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

mi_gdb_test "200-exec-interrupt --all" "200\\^done" "interrupt all threads"

for {set i 0} {$i < 6} {incr i} {
    mi_expect_interrupt "interrupt $i"
}
mi_check_thread_states \
    {"stopped" "stopped" "stopped" "stopped" "stopped" "stopped"} \
    "thread state, all interrupted"

# resume all threads, and check that no thread is spuriously left interrupted
send_gdb "-exec-continue --all\n"
gdb_expect {
    -re ".*$running_re$mi_gdb_prompt" {
	pass "resume all after interrupting"
    }
    timeout {
	fail "resume all after interrupting (timeout)"
    }
}

sleep 1
mi_check_thread_states \
    {"running" "running" "running" "running" "running" "running"} \
    "thread state, resume all after interrupting"

mi_gdb_exit
