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


standard_testfile

if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable debug] != "" } {
    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.
# 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
	}
    }
}

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

