# manythreads.exp -- Expect script to test stopping many threads
# Copyright (C) 2004, 2006, 2007, 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/>.

# This file was written by Jeff Johnston. (jjohnstn@redhat.com)

if $tracelevel then {
	strace $tracelevel
}


set testfile "manythreads"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug "incdir=${objdir}"]] != "" } {
    return -1
}

gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${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.
# On Ultrix, we don't need it and it is really slow (because shell_escape
# doesn't use vfork).
if ![istarget "*-*-ultrix*"] then {
    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 verify that we can do info threads and continue
send_gdb "\003"
set message "stop threads 1"
gdb_test_multiple "" "stop threads 1" {
  -re "\\\[New \[^\]\]*\\\]\r\n" {
    exp_continue
  }
  -re "\\\[\[^\]\]* exited\\\]\r\n" {
    exp_continue
  }
  -re "Thread \[^\n\]* executing\r\n" {
    exp_continue
  }
  -re "Program received signal SIGINT.*$gdb_prompt $" {
    pass "$message"
  }
  timeout {
    fail "$message (timeout)"
  }
}

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
	}
    }
}

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 "Thread \[^\n\]* executing\r\n" {
    exp_continue -continue_timer
  }
  -re "Program 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
send_gdb "\003"
set message "stop threads 2"
gdb_test_multiple "" "stop threads 2" {
  -re "\\\[New \[^\]\]*\\\]\r\n" {
    exp_continue
  }
  -re "\\\[\[^\]\]* exited\\\]\r\n" {
    exp_continue
  }
  -re "Thread \[^\n\]* executing\r\n" {
    exp_continue
  }
  -re "Program received signal SIGINT.*$gdb_prompt $" {
    pass "$message"
  }
  timeout {
    fail "$message (timeout)"
  }
} 

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)"
    }
}

