# Copyright (C) 1996, 1997, 2002, 2003 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# This file was written by Daniel Jacobowitz <drow@mvista.com>
# (parts based on pthreads.exp by Fred Fish (fnf@cygnus.com).
#
# This test covers the various forms of "set scheduler-locking".

if $tracelevel then {
	strace $tracelevel
}

# APPLE LOCAL begin scheduler locking
# We get anywhere from zero to ten schedlock.exp failures on MacOS X
# (Darwin) systems; each run is a different set of failures.  Even if
# we broke this part of gdb we wouldn't be able to recognize a "bad
# run" in schedlock.exp, as opposed to the normal randomness this test
# case exhibits.  So until we can dig in and correct this, we skip it
# on our host.

if [ istarget "*-*-darwin*" ] then {
  gdb_suppress_entire_file "Schedlock tests suppressed on Darwin due to unreproducibility."
  return
}
# APPLE LOCAL end scheduler locking

set prms_id 0
set bug_id 0

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

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

if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug "incdir=${objdir}/${subdir}"]] != "" } {
    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

proc get_args { } {
  global list_count
  global gdb_prompt

  send_gdb "print args\n"
  gdb_expect {
    -re "\\\$\[0-9\]+ = {(\[0-9\]+), (\[0-9\]+), (\[0-9\]+), (\[0-9\]+), (\[0-9\]+), (\[0-9\]+)}.*$gdb_prompt"
      {
	set list_count [expr $list_count + 1]
	pass "listed args ($list_count)"
	return [list $expect_out(1,string) $expect_out(2,string) $expect_out(3,string) $expect_out(4,string) $expect_out(5,string) $expect_out(6,string)]
      }
    -re "$gdb_prompt"
      {
	fail "listed args ($list_count) (unknown output)"
      }
    timeout
      {
	fail "listed args ($list_count) (timeout)"
      }
  }
}

proc stop_process { description } {
  global gdb_prompt

  # For this to work we must be sure to consume the "Continuing."
  # message first, or GDB's signal handler may not be in place.
  after 1000 {send_gdb "\003"}
  gdb_expect {
    -re "Program received signal SIGINT.*$gdb_prompt $"
      {
	pass $description
      }
    -re "Quit.*$gdb_prompt $"
      {
	fail "$description (gdb's signal handler was still in place)"
      }
    timeout
      {
	fail "$description (timeout)"
      }
  }
}

proc get_current_thread { description } {
  global gdb_prompt

  send_gdb "bt\n"
  gdb_expect {
    -re "thread_function \\(arg=0x(\[0-9\])\\).*$gdb_prompt $"
      {
	pass $description
	return $expect_out(1,string)
      }
    -re "$gdb_prompt $"
      {
	fail "$description (unknown output)"
      }
    timeout
      {
	fail "$description (timeout)"
      }
  }
}

proc my_continue { msg } {
  send_gdb "continue\n"
  gdb_expect {
    -re "Continuing"
      { pass "continue ($msg)" }
    timeout
      { fail "continue ($msg) (timeout)" }
  }

  stop_process "stop all threads ($msg)"

  # Make sure we're in one of the non-main looping threads.
  gdb_breakpoint [concat [gdb_get_line_number "schedlock.exp: main loop"] " if arg != 5"]
  gdb_continue_to_breakpoint "return to loop ($msg)"
  delete_breakpoints
}

proc step_ten_loops { msg } {
    global gdb_prompt

    for {set i 0} {[expr $i < 10]} {set i [expr $i + 1]} {
	send_gdb "step\n"
	set other_step 0
	gdb_expect {
	    -re ".*myp\\) \\+\\+;\[\r\n\]+$gdb_prompt $" {
		pass "step to increment ($msg $i)"
	    }
	    -re "$gdb_prompt $" {
		if {$other_step == 0} {
		    set other_step 1
		    send_gdb "step\n"
		    exp_continue
		} else {
		    fail "step to increment ($msg $i)"
		    # FIXME cascade?
		}
	    }
	    timeout {
		fail "step to increment ($msg $i) (timeout)"
	    }
	}
    }
}

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

# 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'" ""
}

gdb_load ${binfile}

gdb_test "set print sevenbit-strings" ""
gdb_test "set width 0" ""

runto_main

# See if scheduler locking is available on this target.
send_gdb "set scheduler-locking off\n"
global gdb_prompt
gdb_expect {
  -re "Target .* cannot support this command"
    {
      unsupported "target does not support scheduler locking"
      return
    }
  -re "$gdb_prompt $"
    {
      pass "scheduler locking set to none"
    }
  timeout
    {
      unsupported "target does not support scheduler locking (timeout)"
      return
    }
}

gdb_breakpoint [gdb_get_line_number "schedlock.exp: last thread start"]
gdb_continue_to_breakpoint "all threads started"

global list_count
set list_count 0

set start_args [get_args]

# First make sure that all threads are alive.
my_continue "initial"

set cont_args [get_args]

for {set i 0} {[expr $i < 6]} {set i [expr $i + 1]} {
  if {[lindex $start_args $i] == [lindex $cont_args $i]} {
    fail "thread $i ran (didn't run)"
  } else {
    pass "thread $i ran"
  }
}

# We can't change threads, unfortunately, in current GDB.  Use
# whichever we stopped in.
set curthread [get_current_thread "find current thread (1)"]




# Test stepping without scheduler locking.
gdb_test "set scheduler-locking off"  ""

step_ten_loops "unlocked"

# Make sure we're still in the same thread.
set newthread [get_current_thread "find current thread (2)"]
if {$curthread == $newthread} {
    pass "step without lock does not change thread"
} else {
    fail "step without lock does not change thread (switched to thread $newthread)"
}

set start_args $cont_args
set cont_args [get_args]

set num_other_threads 0
for {set i 0} {[expr $i < 6]} {set i [expr $i + 1]} {
  if {[lindex $start_args $i] == [lindex $cont_args $i]} {
    if {$i == $curthread} {
      fail "current thread stepped (didn't run)"
    }
  } else {
    if {$i == $curthread} {
	if {[lindex $start_args $i] == [expr [lindex $cont_args $i] - 10]} {
	    pass "current thread stepped"
	} else {
	    fail "current thread stepped (wrong amount)"
	}
    } else {
      set num_other_threads [expr $num_other_threads + 1]
    }
  }
}
if {$num_other_threads > 0} {
  pass "other threads ran (1)"
} else {
  fail "other threads ran (no other threads ran) (1)"
}

# Test continue with scheduler locking
gdb_test "set scheduler-locking on"  ""

my_continue "with lock"

# Make sure we're still in the same thread.
set newthread [get_current_thread "find current thread (3)"]
if {$curthread == $newthread} {
    pass "continue with lock does not change thread"
} else {
    fail "continue with lock does not change thread (switched to thread $newthread)"
}

set start_args $cont_args
set cont_args [get_args]

for {set i 0} {[expr $i < 6]} {set i [expr $i + 1]} {
  if {[lindex $start_args $i] == [lindex $cont_args $i]} {
    if {$i == $curthread} {
      fail "current thread ran (didn't run)"
    } else {
      pass "other thread $i didn't run"
    }
  } else {
    if {$i == $curthread} {
      pass "current thread ran"
    } else {
      fail "other thread $i didn't run (ran)"
    }
  }
}

# Test stepping with scheduler locking
step_ten_loops "locked"

# Make sure we're still in the same thread.
set newthread [get_current_thread "find current thread (2)"]
if {$curthread == $newthread} {
    pass "step with lock does not change thread"
} else {
    fail "step with lock does not change thread (switched to thread $newthread)"
}

set start_args $cont_args
set cont_args [get_args]

for {set i 0} {[expr $i < 6]} {set i [expr $i + 1]} {
  if {[lindex $start_args $i] == [lindex $cont_args $i]} {
    if {$i == $curthread} {
      fail "current thread stepped locked (didn't run)"
    } else {
      pass "other thread $i didn't run (stepping)"
    }
  } else {
    if {$i == $curthread} {
	if {[lindex $start_args $i] == [expr [lindex $cont_args $i] - 10]} {
	    pass "current thread stepped locked"
	} else {
	    fail "current thread stepped locked (wrong amount)"
	}
    } else {
      fail "other thread $i didn't run (stepping) (ran)"
    }
  }
}

return 0
