From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27378 invoked by alias); 12 Jul 2009 18:12:06 -0000 Received: (qmail 27288 invoked by uid 22791); 12 Jul 2009 18:12:03 -0000 X-SWARE-Spam-Status: No, hits=-0.9 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_34,J_CHICKENPOX_43,J_CHICKENPOX_53,J_CHICKENPOX_63,J_CHICKENPOX_83,SPF_HELO_PASS,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mx2.redhat.com (HELO mx2.redhat.com) (66.187.237.31) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 12 Jul 2009 18:11:51 +0000 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n6CIBn3n027153 for ; Sun, 12 Jul 2009 14:11:49 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n6CIBmMM020575; Sun, 12 Jul 2009 14:11:48 -0400 Received: from host0.dyn.jankratochvil.net (sebastian-int.corp.redhat.com [172.16.52.221]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n6CIBlLn028144; Sun, 12 Jul 2009 14:11:47 -0400 Received: from host0.dyn.jankratochvil.net (localhost [127.0.0.1]) by host0.dyn.jankratochvil.net (8.14.3/8.14.3) with ESMTP id n6CIBkkt004342; Sun, 12 Jul 2009 20:11:46 +0200 Received: (from jkratoch@localhost) by host0.dyn.jankratochvil.net (8.14.3/8.14.3/Submit) id n6CIBkEM004337; Sun, 12 Jul 2009 20:11:46 +0200 Date: Mon, 13 Jul 2009 00:47:00 -0000 From: Jan Kratochvil To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [patch] testsuite: Fix racy clashing for gdb.base{1,2}/ parallel run Message-ID: <20090712181146.GA9009@host0.dyn.jankratochvil.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-07/txt/msg00350.txt.bz2 Hi, randomly some testcases fail now with paralell testsuite due to: (gdb) file /.../gdb.base/int-type Reading symbols from /.../gdb.base/int-type...done. [...] (gdb) break main Cannot access memory at address 0x4004bc (gdb) FAIL: gdb.base/logical.exp: setting breakpoint at main ERROR: couldn't run to breakpoint It is because some of the target binaries are reused across the .exp testcases and they can run in parallel from gdb.base1 and gdb.base2 at once storing the binaries both to gdb.base. I did not find any names of binaries to be shared between different subdirectory names. And no other directory besides gdb.base is run in parallel (specifically in two halves in the gdb.base case). Found out these binaries names are shared across these two groups: gdb.base1 ([a-m]*): break constvars int-type gdb.base2 ([n-z]*): return2 run start watch_thread_num Fixed just the minimal set of conflicting testcases the hard way [attached]. It means a similiar race may get introduced again by some future changees. I tried some ways for a general framework fix to store the binaries into separate directories for the gdb.base1 and gdb.base2 runs but I did not find it much feasible. The problems are: ${subdir} must be as-is gdb.base (not gdb.base1) as sources are at ${srcdir}/${subdir}/file.c. There cannot be symlink gdb.base -> gdb.base1 in ${srcdir} as ${srcdir} must be readonly. Therefore ${objdir} could be possibly gdb.base1 (not as-is .). Then binaries would be in gdb.base1/gdb.base (becauase they are in ${objdir}/${subdir}). But the scripts expect now the current directory equals ${objdir} but wit this change the current directory would be ${objdir}/../ . Symlink `ln -s . gdb.base1/gdb.base' cannot be used as then the scripts expect names like gdb.base1/gdb.base/file but GDB prints it as a resolved name gdb.base1/file which does not patch the expect strings. I did no longer try to go that way, just one last thought: Some scripts have bugs so that their binary files are created in the current directory (and not in ${subdir}). Therefore if there would be a change so that the current directory is always in ${objdir} (therefore in gdb.base1) it may be better to globally change the current directory to be in ${objdir}/${subdir}. Regression tested on {x86_64,x86_64-32,i686}-fedora11-linux-gnu. Thanks, Jan gdb/testsuite/ 2009-07-12 Jan Kratochvil Fix racy clashing of output files for gdb.base{1,2}/ parallel run. * gdb.base/annota1.exp (thread_test): Import global $testfile. Change the compilation target to match the testcase name. * gdb.base/sect-cmd.exp: Change the compilation target to match the testcase name. * a2-run.exp: Use for setup prepare_for_testing. Change the compilation target to match the testcase name. * gdb.base/commands.exp: Likewise. * gdb.base/finish.exp: Likewise. * gdb.base/float.exp: Likewise. * gdb.base/info-target.exp: Likewise. * gdb.base/relational.exp: Likewise. * gdb.base/term.exp: Likewise. * gdb.base/until.exp: Likewise. * gdb.base/volatile.exp: Likewise. * gdb.base/whatis-exp.exp: Likewise. --- a/gdb/testsuite/gdb.base/a2-run.exp +++ b/gdb/testsuite/gdb.base/a2-run.exp @@ -31,19 +31,11 @@ if $tracelevel then { set prms_id 0 set bug_id 0 -set testfile "run" -set srcfile ${testfile}.c -set binfile ${objdir}/${subdir}/${testfile} -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { - untested a2-run.exp +set testfile a2-run +if { [prepare_for_testing ${testfile}.exp $testfile run.c] } { return -1 } -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - # Run with no arguments. # On VxWorks this justs make sure the program was run. gdb_run_cmd --- a/gdb/testsuite/gdb.base/annota1.exp +++ b/gdb/testsuite/gdb.base/annota1.exp @@ -491,11 +491,10 @@ if [ regexp "core not found" $exec_output] { } proc thread_test {} { - global objdir subdir srcdir + global objdir subdir srcdir testfile global gdb_prompt old_gdb_prompt - set testfile "watch_thread_num" - set srcfile ${testfile}.c - set binfile ${objdir}/${subdir}/${testfile} + set srcfile watch_thread_num.c + set binfile ${objdir}/${subdir}/${testfile}-watch_thread_num set gdb_prompt $old_gdb_prompt if { ![get_compiler_info ${binfile}] && [gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] == "" } { --- a/gdb/testsuite/gdb.base/commands.exp +++ b/gdb/testsuite/gdb.base/commands.exp @@ -25,20 +25,10 @@ if $tracelevel then { set prms_id 0 set bug_id 0 -set testfile "run" -set srcfile ${testfile}.c -set binfile ${objdir}/${subdir}/commands -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DFAKEARGV}] != "" } { - untested commands.exp - return -1 +if { [prepare_for_testing commands.exp commands run.c {debug additional_flags=-DFAKEARGV}] } { + return -1 } -gdb_exit -gdb_start -delete_breakpoints -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - proc gdbvar_simple_if_test {} { global gdb_prompt --- a/gdb/testsuite/gdb.base/finish.exp +++ b/gdb/testsuite/gdb.base/finish.exp @@ -23,12 +23,8 @@ set prms_id 0 set bug_id 0 # re-use the program from the "return2" test. -set testfile "return2" -set srcfile ${testfile}.c -set binfile ${objdir}/${subdir}/${testfile} -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { - untested finish.exp - return -1 +if { [prepare_for_testing finish.exp finish return2.c] } { + return -1 } proc finish_1 { type } { @@ -128,12 +124,5 @@ proc finish_tests { } { finish_abbreviation "fin" } -# Start with a fresh gdb. - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - set timeout 30 finish_tests --- a/gdb/testsuite/gdb.base/float.exp +++ b/gdb/testsuite/gdb.base/float.exp @@ -29,19 +29,10 @@ if $tracelevel { set prms_id 0 set bug_id 0 -set testfile "run" -set srcfile ${testfile}.c -set binfile ${objdir}/${subdir}/${testfile} -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { - untested float.exp +if { [prepare_for_testing float.exp float run.c] } { return -1 } -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - # Set it up at a breakpoint so we have its registers. if ![runto_main] then { --- a/gdb/testsuite/gdb.base/info-target.exp +++ b/gdb/testsuite/gdb.base/info-target.exp @@ -20,18 +20,11 @@ if $tracelevel then { set prms_id 0 set bug_id 0 -set testfile start -set srcfile ${testfile}.c -set binfile ${objdir}/${subdir}/${testfile} -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { +set testfile info-target +if { [prepare_for_testing ${testfile}.exp $testfile start.c] } { return -1 } -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - set eol "\[\r\n\]+" # Check the output of "info target". Note that we are not interested --- a/gdb/testsuite/gdb.base/relational.exp +++ b/gdb/testsuite/gdb.base/relational.exp @@ -31,23 +31,13 @@ if $tracelevel then { set prms_id 0 set bug_id 0 -set testfile "int-type" -set srcfile ${testfile}.c -set binfile ${objdir}/${subdir}/${testfile} -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } { - untested relational.exp - return -1 - } - -if [get_compiler_info ${binfile}] { - return -1; +if { [prepare_for_testing relational.exp relational int-type.c {debug nowarnings}] } { + return -1 } -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - +if [get_compiler_info not-used] { + return -1; +} # # set it up at a breakpoint so we can play with the variable values --- a/gdb/testsuite/gdb.base/sect-cmd.exp +++ b/gdb/testsuite/gdb.base/sect-cmd.exp @@ -35,9 +35,9 @@ if ![istarget "hppa*-*-hpux*"] then { return } -set testfile "break" -set srcfile ${testfile}.c -set srcfile1 ${testfile}1.c +set testfile "sect-cmd" +set srcfile break.c +set srcfile1 break1.c set binfile ${objdir}/${subdir}/${testfile} if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}0.o" object {debug nowarnings}] != "" } { --- a/gdb/testsuite/gdb.base/term.exp +++ b/gdb/testsuite/gdb.base/term.exp @@ -38,20 +38,10 @@ gdb_start set prms_id 0 set bug_id 0 -set testfile "run" -set srcfile ${testfile}.c -set binfile ${objdir}/${subdir}/${testfile} -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { - untested term.exp - return -1 +if { [prepare_for_testing term.exp term run.c] } { + return -1 } -gdb_exit -gdb_start -delete_breakpoints -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - gdb_test "set print sevenbit-strings" "" "test set print sevenbit-strings" gdb_test "set print address off" "" "test set print address off" gdb_test "set width 0" "" "test set width 0" --- a/gdb/testsuite/gdb.base/until.exp +++ b/gdb/testsuite/gdb.base/until.exp @@ -19,31 +19,11 @@ if $tracelevel then { strace $tracelevel } -set testfile "break" -set srcfile ${testfile}.c -set srcfile1 ${testfile}1.c -set binfile ${objdir}/${subdir}/${testfile} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}0.o" object {debug nowarnings}] != "" } { - untested until.exp - return -1 -} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile}1.o" object {debug nowarnings}] != "" } { - untested until.exp - return -1 +set srcfile break.c +if { [prepare_for_testing until.exp "until" {break.c break1.c} {debug nowarnings}] } { + return -1 } -if { [gdb_compile "${binfile}0.o ${binfile}1.o" "${binfile}" executable {debug nowarnings}] != "" } { - untested until.exp - return -1 -} - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - set bp_location1 [gdb_get_line_number "set breakpoint 1 here"] set bp_location19 [gdb_get_line_number "set breakpoint 19 here"] set bp_location20 [gdb_get_line_number "set breakpoint 20 here"] --- a/gdb/testsuite/gdb.base/volatile.exp +++ b/gdb/testsuite/gdb.base/volatile.exp @@ -42,26 +42,16 @@ set bug_id 0 # Use the same test program constvars.c. -set testfile "constvars" -set srcfile ${testfile}.c -set binfile ${objdir}/${subdir}/${testfile} +if { [prepare_for_testing volatile.exp volatile constvars.c] } { + return -1 +} # Create and source the file that provides information about the compiler # used to compile the test case. -if [get_compiler_info ${binfile}] { +if [get_compiler_info not-used] { return -1; } -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable debug ] != "" } { - untested volatile.exp - return -1 -} - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - # # set it up at a breakpoint so we can play with the variable values # --- a/gdb/testsuite/gdb.base/whatis-exp.exp +++ b/gdb/testsuite/gdb.base/whatis-exp.exp @@ -35,20 +35,9 @@ if $tracelevel then { set prms_id 0 set bug_id 0 -set testfile "int-type" -set srcfile ${testfile}.c -set binfile ${objdir}/${subdir}/${testfile} -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } { - untested whatis-exp.exp - return -1 - } - - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - +if { [prepare_for_testing whatis-exp.exp whatis-exp int-type.c {debug nowarnings}] } { + return -1 +} # # set it up at a breakpoint so we can play with the variable values