Index: gdb/testsuite/gdb.threads/attach-into-signal.exp |
diff --git a/gdb/testsuite/gdb.threads/attach-into-signal.exp b/gdb/testsuite/gdb.threads/attach-into-signal.exp |
index db8822208537acee453b128a1302df7e576eb414..c74fafa4842a343f8d02f1da5b619e577109738c 100644 |
--- a/gdb/testsuite/gdb.threads/attach-into-signal.exp |
+++ b/gdb/testsuite/gdb.threads/attach-into-signal.exp |
@@ -22,149 +22,162 @@ if { ![isnative] || [is_remote host] || [target_info exists use_gdb_stub] |
continue |
} |
-set testfile "attach-into-signal" |
-set srcfile ${testfile}.c |
-set binfile ${objdir}/${subdir}/${testfile} |
-set escapedbinfile [string_to_regexp ${objdir}/${subdir}/${testfile}] |
+standard_testfile |
+set executable_nothr ${testfile}-nothr |
+set executable_thr ${testfile}-thr |
-remote_exec build "rm -f ${binfile}" |
-# For debugging this test |
-# |
-#log_user 1 |
- |
-proc corefunc { threadtype } { |
+proc corefunc { threadtype executable } { |
global srcfile |
- global binfile |
- global escapedbinfile |
global srcdir |
global subdir |
global gdb_prompt |
- if [get_compiler_info ${binfile}] { |
- return -1 |
- } |
+ with_test_prefix "$threadtype" { |
+ clean_restart ${executable} |
- # Start the program running and then wait for a bit, to be sure |
- # that it can be attached to. |
- # Statistically there is a better chance without giving process a nice. |
- |
- set testpid [eval exec $binfile &] |
- exec sleep 2 |
- |
- # Run 2 passes of the test. |
- # The C file inferior stops pending its signals if a single one is lost, |
- # we test successful redelivery of the caught signal by the 2nd pass. |
- |
- # linux-2.6.20.4.x86_64 had maximal attempt # 20 in 4 test runs. |
- set attempts 100 |
- set attempt 1 |
- set passes 1 |
- while { $passes < 3 && $attempt <= $attempts } { |
- set stoppedtry 0 |
- while { $stoppedtry < 10 } { |
- if [catch {open /proc/${testpid}/status r} fileid] { |
- set stoppedtry 10 |
- break |
- } |
- gets $fileid line1; |
- gets $fileid line2; |
- close $fileid; |
+ set binfile [standard_output_file $executable] |
+ set escapedbinfile [string_to_regexp ${binfile}] |
- if {![string match "*(stopped)*" $line2]} { |
- # No PASS message as we may be looping in multiple attempts. |
- break |
- } |
- sleep 1 |
- set stoppedtry [expr $stoppedtry + 1] |
- } |
- if { $stoppedtry >= 10 } { |
- verbose -log $line2 |
- set test "$threadtype: process is still running on the attempt # $attempt of $attempts" |
- break |
+ if [get_compiler_info] { |
+ return -1 |
} |
- # Main test: |
- set test "$threadtype: attach (pass $passes), pending signal catch" |
- if {[gdb_test_multiple "attach $testpid" $test { |
- -re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*Received Alarm clock.*$gdb_prompt $" { |
- # nonthreaded: |
- pass $test |
- verbose -log "$test succeeded on the attempt # $attempt of $attempts" |
- set passes [expr $passes + 1] |
- } |
- -re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*$gdb_prompt $" { |
- # nonthreaded: |
- # We just lack the luck, we should try it again. |
- set attempt [expr $attempt + 1] |
+ gdb_test "handle SIGALRM stop print pass" "Yes.*Yes.*Yes.*" |
+ |
+ # Start the program running and then wait for a bit, to be sure |
+ # that it can be attached to. |
+ # Statistically there is a better chance without giving process a nice. |
+ |
+ set testpid [eval exec $binfile &] |
+ exec sleep 2 |
+ |
+ # Run 2 passes of the test. |
+ # The C file inferior stops pending its signals if a single one is lost, |
+ # we test successful redelivery of the caught signal by the 2nd pass. |
+ |
+ # linux-2.6.20.4.x86_64 had maximal attempt # 20 in 4 test runs. |
+ set attempts 100 |
+ set attempt 1 |
+ set passes 1 |
+ while { $passes < 3 && $attempt <= $attempts } { |
+ set stoppedtry 0 |
+ while { $stoppedtry < 10 } { |
+ if [catch {open /proc/${testpid}/status r} fileid] { |
+ set stoppedtry 10 |
+ break |
+ } |
+ gets $fileid line1; |
+ gets $fileid line2; |
+ close $fileid; |
+ |
+ if {![string match "*(stopped)*" $line2]} { |
+ # No PASS message as we may be looping in multiple |
+ # attempts. |
+ break |
+ } |
+ sleep 1 |
+ set stoppedtry [expr $stoppedtry + 1] |
} |
- -re "Attaching to process $testpid.*Received Alarm clock.*$gdb_prompt $" { |
- # threaded: |
- pass $test |
- verbose -log "$test succeeded on the attempt # $attempt of $attempts" |
- set passes [expr $passes + 1] |
+ if { $stoppedtry >= 10 } { |
+ verbose -log $line2 |
+ set test "process is still running on the attempt # $attempt of $attempts" |
+ break |
} |
- -re "Attaching to process $testpid.*$gdb_prompt $" { |
- # threaded: |
- # We just lack the luck, we should try it again. |
- set attempt [expr $attempt - 1] |
+ |
+ # Main test: |
+ set test "attach (pass $passes), pending signal catch" |
+ if {[gdb_test_multiple "attach $testpid" $test { |
+ -re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*Program received signal SIGALRM.*$gdb_prompt $" { |
+ # nonthreaded: |
+ pass $test |
+ verbose -log "$test succeeded on the attempt # $attempt of $attempts" |
+ set passes [expr $passes + 1] |
+ } |
+ -re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*$gdb_prompt $" { |
+ set ok 0 |
+ |
+ if { $threadtype == "threaded" } { |
+ # In the threaded case, the signal is left |
+ # pending on the second thread. Check for |
+ # that by peeking at the thread's siginfo. |
+ # SIGALRM is 14, SIGSTOP is 19. |
+ |
+ # With remote targets, we need to pull the |
+ # thread list explicitly before GDB even knows |
+ # about thread 2. |
+ set test2 "pull thread list" |
+ gdb_test_multiple "info threads" $test2 { |
+ -re "\r\n$gdb_prompt $" { |
+ } |
+ } |
+ |
+ set test2 "thread apply 2 print \$_siginfo.si_signo" |
+ gdb_test_multiple $test2 $test2 { |
+ -re " = 14\r\n$gdb_prompt $" { |
+ set ok 1 |
+ } |
+ -re " = 19\r\n$gdb_prompt $" { |
+ } |
+ } |
+ } else { |
+ # In the nonthreaded case, GDB should tell the |
+ # user about having seen a signal. |
+ } |
+ |
+ if { $ok == 0} { |
+ # We just lack the luck, we should try it again. |
+ set attempt [expr $attempt + 1] |
+ } else { |
+ pass $test |
+ verbose -log "$test succeeded on the attempt # $attempt of $attempts" |
+ set passes [expr $passes + 1] |
+ } |
+ } |
+ }] != 0 } { |
+ break |
} |
- }] != 0 } { |
- break |
- } |
- gdb_test "detach" "Detaching from.*" "" |
- } |
- if {$passes < 3} { |
- if {$attempt > $attempts} { |
- unresolved $test |
- } else { |
- fail $test |
+ gdb_test "detach" "Detaching from.*" "" |
+ } |
+ if {$passes < 3} { |
+ if {$attempt > $attempts} { |
+ unresolved $test |
+ } else { |
+ fail $test |
+ } |
} |
- } |
- # Exit and detach the process. |
+ # Exit and detach the process. |
- gdb_exit |
+ gdb_exit |
- # Make sure we don't leave a process around to confuse |
- # the next test run (and prevent the compile by keeping |
- # the text file busy), in case the "set should_exit" didn't |
- # work. |
+ # Make sure we don't leave a process around to confuse the |
+ # next test run (and prevent the compile by keeping the text |
+ # file busy), in case the "set should_exit" didn't work. |
- # Continue the program - some Linux kernels need it before -9 if the |
- # process is stopped. |
- remote_exec build "kill -s CONT ${testpid}" |
+ # Continue the program - some Linux kernels need it before -9 if the |
+ # process is stopped. |
+ remote_exec build "kill -s CONT ${testpid}" |
- remote_exec build "kill -9 ${testpid}" |
-} |
+ remote_exec build "kill -9 ${testpid}" |
-# Start with clean gdb |
-gdb_exit |
+ } |
+} |
# build the test case first without threads |
# |
-if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { |
- untested "attach-into-signal.exp (unthreaded)" |
+if {[build_executable $testfile $executable_nothr $srcfile] == -1} { |
+ untested "attach-into-signal.exp (nonthreaded)" |
return -1 |
} |
-gdb_start |
-gdb_reinitialize_dir $srcdir/$subdir |
-gdb_load ${binfile} |
-gdb_test_no_output "set debug lin-lwp 1" "" |
- |
-corefunc nonthreaded |
+corefunc nonthreaded ${executable_nothr} |
# build the test case also with threads |
# |
-if { [gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DUSE_THREADS}] != "" } { |
+if { [gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" [standard_output_file ${executable_thr}] executable {debug additional_flags=-DUSE_THREADS}] != "" } { |
untested "attach-into-signal.exp (threaded)" |
return -1 |
} |
-gdb_start |
-gdb_reinitialize_dir $srcdir/$subdir |
-gdb_load ${binfile} |
-gdb_test_no_output "set debug lin-lwp 1" "" |
- |
-corefunc threaded |
+corefunc threaded ${executable_thr} |