# 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
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_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"
}

gdb_test_multiple "-exec-continue --all" "resume all, no breakpoint" {
    -re ".*$running_re$mi_gdb_prompt" {
	pass "resume all, no breakpoint"
    }
}
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
gdb_test_multiple "-exec-continue --all" "resume all after interrupting" {
    -re ".*$running_re$mi_gdb_prompt" {
	pass "resume all after interrupting"
    }
}

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

mi_gdb_exit
