# manythreads.exp -- Expect script to test stopping many threads
# Copyright (C) 2004, 2006, 2007, 2008, 2009 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 prms_id 0
set bug_id 0

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

