* linux-nat.c (count_events_callback, select_event_lwp_callback): Only
[deliverable/binutils-gdb.git] / gdb / testsuite / gdb.threads / schedlock.exp
index ea2d8d3fdc65e8b1d0191f09746b227b5bb94ba5..8faee9fdb87bb27810fa443d109b38b4aad2a47f 100644 (file)
@@ -1,18 +1,18 @@
-# Copyright (C) 1996, 1997, 2002 Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 2002, 2003, 2007, 2008
+# 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
+# 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, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # Please email any bugs, comments, and/or additions to this file to:
 # bug-gdb@prep.ai.mit.edu
@@ -33,41 +33,10 @@ set testfile "schedlock"
 set srcfile ${testfile}.c
 set binfile ${objdir}/${subdir}/${testfile}
 
-set built_binfile 0
+# The number of threads, including the main thread.
+set NUM 2
 
-# Default to the usual (only?) -lpthread on GNU/Linux to quiet noise
-if [istarget "*-*-linux*"] then {
-    set possible_libs "-lpthread -lpthreads -lthread"
-} else {
-    set possible_libs "-lpthreads -lpthread -lthread"
-}
-
-set why_msg "unrecognized error"
-foreach lib $possible_libs {
-    set options "debug"
-    lappend options "incdir=${objdir}/${subdir}"
-    lappend options "libs=$lib"
-    set ccout [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable $options]
-    switch -regexp -- $ccout {
-       ".*no posix threads support.*" {
-           set why_msg "missing threads include file"
-           break
-       }
-       ".*cannot open -lpthread.*" {
-           set why_msg "missing runtime threads library"
-       }
-       ".*Can't find library for -lpthread.*" {
-           set why_msg "missing runtime threads library"
-       }
-       {^$} {
-           pass "successfully compiled posix threads test case"
-           set built_binfile 1
-           break
-       }
-    }
-}
-if {$built_binfile == "0"} {
-    unsupported "Couldn't compile ${srcfile}, ${why_msg}"
+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug "incdir=${objdir}"]] != "" } {
     return -1
 }
 
@@ -76,14 +45,25 @@ if {$built_binfile == "0"} {
 proc get_args { } {
   global list_count
   global gdb_prompt
+  global NUM
+
+  set pattern "(\[0-9\]+)"
+  for {set i 1} {[expr $i < $NUM]} {incr i} {
+    append pattern ", (\[0-9\]+)"
+  }
 
   send_gdb "print args\n"
   gdb_expect {
-    -re "\\\$\[0-9\]+ = {(\[0-9\]+), (\[0-9\]+), (\[0-9\]+), (\[0-9\]+), (\[0-9\]+), (\[0-9\]+)}.*$gdb_prompt"
+    -re "\\\$\[0-9\]+ = {$pattern}.*$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)]
+
+       set result ""
+       for {set i 1} {[expr $i <= $NUM]} {incr i} {
+         lappend result $expect_out($i,string)
+       }
+       return $result
       }
     -re "$gdb_prompt"
       {
@@ -146,8 +126,8 @@ proc my_continue { msg } {
 
   stop_process "stop all threads ($msg)"
 
-  # Make sure we're in one of the looping threads.
-  gdb_breakpoint [gdb_get_line_number "schedlock.exp: main loop"]
+  # 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 != 0"]
   gdb_continue_to_breakpoint "return to loop ($msg)"
   delete_breakpoints
 }
@@ -233,13 +213,17 @@ my_continue "initial"
 
 set cont_args [get_args]
 
-for {set i 0} {[expr $i < 6]} {set i [expr $i + 1]} {
+set bad 0
+for {set i 0} {[expr $i < $NUM]} {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"
+    incr bad
   }
 }
+if { $bad == 0 } {
+  pass "all threads alive"
+} else {
+  fail "all threads alive ($bad/$NUM did not run)"
+}
 
 # We can't change threads, unfortunately, in current GDB.  Use
 # whichever we stopped in.
@@ -264,12 +248,11 @@ if {$curthread == $newthread} {
 set start_args $cont_args
 set cont_args [get_args]
 
-for {set i 0} {[expr $i < 6]} {set i [expr $i + 1]} {
+set num_other_threads 0
+for {set i 0} {[expr $i < $NUM]} {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 {
-      fail "other thread $i ran (didn't run) (1)"
     }
   } else {
     if {$i == $curthread} {
@@ -279,10 +262,15 @@ for {set i 0} {[expr $i < 6]} {set i [expr $i + 1]} {
            fail "current thread stepped (wrong amount)"
        }
     } else {
-      pass "other thread $i ran (1)"
+      set num_other_threads [expr $num_other_threads + 1]
     }
   }
 }
+if {$num_other_threads > 0} {
+  pass "other threads ran - unlocked"
+} else {
+  fail "other threads ran - unlocked"
+}
 
 # Test continue with scheduler locking
 gdb_test "set scheduler-locking on"  ""
@@ -300,21 +288,25 @@ if {$curthread == $newthread} {
 set start_args $cont_args
 set cont_args [get_args]
 
-for {set i 0} {[expr $i < 6]} {set i [expr $i + 1]} {
+set num_other_threads 0
+for {set i 0} {[expr $i < $NUM]} {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)"
+      incr num_other_threads
     }
   }
 }
+if {$num_other_threads > 0} {
+  fail "other threads didn't run - locked"
+} else {
+  pass "other threads didn't run - locked"
+}
 
 # Test stepping with scheduler locking
 step_ten_loops "locked"
@@ -330,12 +322,11 @@ if {$curthread == $newthread} {
 set start_args $cont_args
 set cont_args [get_args]
 
-for {set i 0} {[expr $i < 6]} {set i [expr $i + 1]} {
+set num_other_threads 0
+for {set i 0} {[expr $i < $NUM]} {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} {
@@ -345,9 +336,14 @@ for {set i 0} {[expr $i < 6]} {set i [expr $i + 1]} {
            fail "current thread stepped locked (wrong amount)"
        }
     } else {
-      fail "other thread $i didn't run (stepping) (ran)"
+      incr num_other_threads
     }
   }
 }
+if {$num_other_threads > 0} {
+  fail "other threads didn't run - step locked"
+} else {
+  pass "other threads didn't run - step locked"
+}
 
 return 0
This page took 0.027292 seconds and 4 git commands to generate.