# manythreads.exp -- Expect script to test stopping many threads
# Copyright (C) 2004-2021 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 file was written by Jeff Johnston. (jjohnstn@redhat.com)

# This test requires sending ^C to interrupt the running target.
if [target_info exists gdb,nointerrupts] {
    verbose "Skipping manythreads.exp because of nointerrupts."
    return
}

standard_testfile

set opts { debug }
if [info exists DEBUG] {
    # make check RUNTESTFLAGS='gdb.threads/manythreads.exp DEBUG=1'
    lappend opts "additional_flags=-DDEBUG"
}

if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable $opts] != "" } {
    return -1
}

clean_restart ${binfile}
gdb_test_no_output "set print sevenbit-strings"
runto_main

# We'll need this when we send_gdb a ^C to GDB.  Need to do it before we
# run the program and gdb starts saving and restoring tty states.
gdb_test "shell stty intr '^C'" ".*"

set message "first continue"
gdb_test_multiple "continue" "first continue" {
  -re "error:.*$gdb_prompt $" {
    fail "$message"
  }
  -re "Continuing" {
    pass "$message"
  }
}

# Wait one second.  This is better than the TCL "after" command, because
# we don't lose GDB's output while we do it.
remote_expect host 1 { timeout { } }

# Send a Ctrl-C and wait for the SIGINT.

proc interrupt_and_wait { message } {
    global gdb_prompt

    send_gdb "\003"

    gdb_test_multiple "" $message {
	-re "\\\[New \[^\]\]*\\\]\r\n" {
	    exp_continue
	}
	-re "\\\[\[^\]\]* exited\\\]\r\n" {
	    exp_continue
	}
	-re " received signal SIGINT.*$gdb_prompt $" {
	    pass "$message"
	}
	-re "$gdb_prompt $" {
	    # Note that with this regex order, if GDB emits [New
	    # Thread ...] output between "Thread NNN received signal"
	    # and the prompt, the "received signal" regex won't match.
	    # That's good, as if we see that happening, it's a
	    # regression.
	    #
	    # GDB makes sure to notify about signal stops, end of
	    # stepping ranges, etc., only after updating the thread
	    # list, otherwise that stop info would be easy to miss.
	    #
	    # A BROKEN example would be:
	    #
	    #  ... pages of new threads output ...
	    #  [New Thread NNN]
	    #  ^C
	    #  ... more new threads output ...
	    #  [New Thread NNN]
	    #  [New Thread NNN]
	    #  Thread NNN received signal SIGINT, Interrupt.
	    #  [New Thread NNN]
	    #  [New Thread NNN]
	    #  ... pages of new threads output ...
	    #  [Switching to Thread NNN]
	    #  foo () at foo.c:31
	    #  31      bar ();
	    #
	    fail $message
	}
    }
}

# Send a Ctrl-C and verify that we can do info threads and continue
interrupt_and_wait "stop threads 1"

set cmd "info threads"
set ok 0
gdb_test_multiple $cmd $cmd {
    -re " 1 *Thread " {
	set ok 1
	exp_continue
    }
    -re ".*\r\n" {
	# Eat this line and continue, to prevent the buffer overflowing.
	exp_continue
    }
    -re "$gdb_prompt $" {
	if { $ok } {
	    pass $cmd
	} else {
	    fail $cmd
	}
    }
}

gdb_test_no_output "thread name zardoz" "give a name to the thread"
gdb_test "info threads" ".*zardoz.*" "check thread name"

set message "second continue"
gdb_test_multiple "continue" "second continue" {
  -re "error:.*$gdb_prompt $" {
    fail "$message"
  }
  -re "Continuing" {
    pass "$message"
  }
}

# Wait another second.  If the program stops on its own, GDB has failed
# to handle duplicate SIGINTs sent to multiple threads.
set failed 0
remote_expect host 1 {
  -re "\\\[New \[^\]\]*\\\]\r\n" {
    exp_continue -continue_timer
  }
  -re "\\\[\[^\]\]* exited\\\]\r\n" {
    exp_continue -continue_timer
  }
  -re " received signal SIGINT.*$gdb_prompt $" {
    if { $failed == 0 } {
      fail "check for duplicate SIGINT"
    }
    send_gdb "continue\n"
    set failed 1
    exp_continue
  }
  timeout {
    if { $failed == 0 } {
      pass "check for duplicate SIGINT"
    }
  }
}

# Send another Ctrl-C and verify that we can do info threads and quit
interrupt_and_wait "stop threads 2"

gdb_test_multiple "quit" "GDB exits after stopping multithreaded program" {
    -re "Quit anyway\\? \\(y or n\\) $" {
	send_gdb "y\n"
	exp_continue
    }
    eof {
        pass "GDB exits after stopping multithreaded program"
    }
    timeout {
        fail "GDB exits after stopping multithreaded program (timeout)"
    }
}

