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

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"

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
