# step2.exp -- Expect script to test gdb step.c
# Copyright (C) 1992, 1997, 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 Law. (law@cygnus.com)
#


if $tracelevel then {
	strace $tracelevel
}

set program_exited 0

# A simple and crude test to see that we can step two threads independently
proc test_multi_threaded_stepping {} {
    global gdb_prompt
    global hex
    global srcfile
    global decimal

    # Set breakpoints in code that we know is executed in only
    # thread of control.
    gdb_test "break thread1" \
	     "Break.* at $hex: file .*$srcfile, line $decimal\\."
    gdb_test "break thread2" \
	     "Break.* at $hex: file .*$srcfile, line $decimal\\."

    # the order in which things happen is indeterminate.  So we basically
    # look for a set of events and note that each one happens and that
    # all of the required events have happened when we're done.
    #
    # Right now we only verify that both threads start and that they
    # both call pthread_cond_wait twice.
    set thread1started 0
    set thread1condwait 0
    set thread2started 0
    set thread2condwait 0
    
    send_gdb "run\n"
    gdb_expect {
	-re "The program .* has been started already.*y or n. $" {
	    send_gdb "y\n"
	    exp_continue
	}
	-re ".*Breakpoint \[0-9\]+,.*thread1.* at .*$srcfile:.*\[\t \].*$gdb_prompt $" {
	    if { $thread1started != 0 } then {
		fail "thread1 started"
		return
	    } else {
		set thread1started 1
		pass "thread1 started"
	    }
	    send_gdb "step\n"
	    exp_continue
	}
	-re ".*Breakpoint \[0-9\]+,.*thread2.* at .*$srcfile:.*\[\t \].*$gdb_prompt $" {
	    if { $thread2started != 0 } then {
		fail "thread2 started"
		return
	    } else {
		set thread2started 1
		pass "thread2 started"
	    }
	    send_gdb "step\n"
	    exp_continue
	}
	-re ".*pthread_cond_wait.*cv_a.*$gdb_prompt" {
	    if { $thread1started == 0 } then {
		fail "thread1 condwait"
		return
	    }
	    if { $thread1condwait < 2 } then {
		pass "thread1 condwait"
		incr thread1condwait
	    }
	    if { $thread2condwait == 2 } then {
		pass "multi threaded stepping"
		return
	    }
	    send_gdb "step\n"
	    exp_continue
	}
		    
	-re ".*pthread_cond_wait.*cv_b.*$gdb_prompt" {
	    if { $thread2started == 0 } then {
		fail "thread2 condwait"
		return
	    }
	    if { $thread2condwait < 2 } then {
		pass "thread2 condwait"
		incr thread2condwait
	    }
	    if { $thread1condwait == 2 } then {
		pass "multi threaded stepping"
		return
	    }
	    send_gdb "step\n"
	    exp_continue
	}
		    
	-re "$gdb_prompt" {
	    send_gdb "step\n"
	    exp_continue
	}
	default { fail "multi threaded stepping" }
    }
}

# Check to see if we have an executable to test.  If not, then either we
# haven't tried to compile one, or the compilation failed for some reason.
# In either case, just notify the user and skip the tests in this file.

set binfile "step"
set srcfile "step.c"

if ![file exists $objdir/$subdir/$binfile] then {
    if $all_flag then {
	warning "$binfile does not exist; tests suppressed."
    }
    return
}

set prms_id 0
set bug_id 0

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load $objdir/$subdir/$binfile

test_multi_threaded_stepping
