From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10686 invoked by alias); 26 Apr 2009 19:32:06 -0000 Received: (qmail 10678 invoked by uid 22791); 26 Apr 2009 19:32:05 -0000 X-SWARE-Spam-Status: No, hits=-2.2 required=5.0 tests=AWL,BAYES_00,SPF_PASS X-Spam-Check-By: sourceware.org Received: from smtp-out.google.com (HELO smtp-out.google.com) (216.239.45.13) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 26 Apr 2009 19:31:59 +0000 Received: from zps19.corp.google.com (zps19.corp.google.com [172.25.146.19]) by smtp-out.google.com with ESMTP id n3QJVv5K014586 for ; Sun, 26 Apr 2009 12:31:57 -0700 Received: from localhost (ruffy.mtv.corp.google.com [172.18.118.116]) by zps19.corp.google.com with ESMTP id n3QJVuVh017961 for ; Sun, 26 Apr 2009 12:31:57 -0700 Received: by localhost (Postfix, from userid 67641) id 9F5B384890; Sun, 26 Apr 2009 12:31:56 -0700 (PDT) To: gdb-patches@sourceware.org Subject: [RFA] Make watchthreads.exp more robust Message-Id: <20090426193156.9F5B384890@localhost> Date: Sun, 26 Apr 2009 19:32:00 -0000 From: dje@google.com (Doug Evans) X-System-Of-Record: true 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-04/txt/msg00722.txt.bz2 Hi. watchthreads.exp can errantly fail if the o/s schedules, for example, the thread for args[0] enough times before the thread for args[1] gets a chance to run. Ok to check in? 2009-04-26 Doug Evans * gdb.threads/watchthreads.c (main): Initialize args before starting the threads. Plus formatting cleanup. * gdb.threads/watchthreads.exp: Avoid errant failures due to biased scheduling of one thread. Index: watchthreads.c =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.threads/watchthreads.c,v retrieving revision 1.6 diff -u -p -u -p -r1.6 watchthreads.c --- watchthreads.c 3 Jan 2009 05:58:07 -0000 1.6 +++ watchthreads.c 26 Apr 2009 18:54:22 -0000 @@ -22,34 +22,49 @@ #include #include -void *thread_function(void *arg); /* Pointer to function executed by each thread */ +void *thread_function (void *arg); /* Function executed by each thread. */ #define NUM 5 unsigned int args[NUM+1]; -int main() { +int +main () +{ int res; pthread_t threads[NUM]; void *thread_result; long i; + /* To keep the test determinative, initialize args first, + then start all the threads. Otherwise, the way watchthreads.exp + is written, we have to worry about things like threads[0] getting + to 29 hits of args[0] before args[1] gets changed. */ + + for (i = 0; i < NUM; i++) + { + /* The call to usleep is so that when the watchpoint triggers, + the pc is still on the same line. */ + args[i] = 1; usleep (1); /* Init value. */ + } + for (i = 0; i < NUM; i++) { - args[i] = 1; /* Init value. */ - res = pthread_create(&threads[i], - NULL, - thread_function, - (void *) i); + res = pthread_create (&threads[i], + NULL, + thread_function, + (void *) i); } args[i] = 1; thread_function ((void *) i); - exit(EXIT_SUCCESS); + exit (EXIT_SUCCESS); } -void *thread_function(void *arg) { +void * +thread_function (void *arg) +{ int my_number = (long) arg; int *myp = (int *) &args[my_number]; @@ -59,6 +74,6 @@ void *thread_function(void *arg) { (*myp) ++; usleep (1); /* Loop increment. */ } - pthread_exit(NULL); + pthread_exit (NULL); } Index: watchthreads.exp =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.threads/watchthreads.exp,v retrieving revision 1.7 diff -u -p -u -p -r1.7 watchthreads.exp --- watchthreads.exp 3 Jan 2009 05:58:07 -0000 1.7 +++ watchthreads.exp 26 Apr 2009 18:54:22 -0000 @@ -62,8 +62,10 @@ set args_1 0 # Watch values that will be modified by distinct threads. gdb_test "watch args\[0\]" "Hardware watchpoint 2: args\\\[0\\\]" gdb_test "watch args\[1\]" "Hardware watchpoint 3: args\\\[1\\\]" +set hwwp_2_enabled 1 +set hwwp_3_enabled 1 -set init_line [expr [gdb_get_line_number "Init value"]+1] +set init_line [gdb_get_line_number "Init value"] set inc_line [gdb_get_line_number "Loop increment"] set main_loc "main \\\(\\\) at .*watchthreads.c:$init_line" set thread0_loc "thread_function \\\(arg=0x0\\\) at .*watchthreads.c:$inc_line" @@ -114,6 +116,27 @@ for {set i 0} {$i < 30} {incr i} { } else { fail "threaded watch loop" } + + # If one of the watchpoints is disabled, we'd better not stop there. + if { !$hwwp_2_enabled && $test_flag_0 } { + fail "disabled hw watchpoint 2 triggered" + } + if { !$hwwp_3_enabled && $test_flag_1 } { + fail "disabled hw watchpoint 3 triggered" + } + + # If we get to 10 in one of the watched locations disable it so we + # see some of the other watched location. + # 10 is chosen so we're guaranteed to come through here. + if { $hwwp_2_enabled && $hwwp_3_enabled } { + if { $args_0 >= 10 && $hwwp_2_enabled } { + gdb_test "disable 2" "" + set hwwp_2_enabled 0 + } elseif { $args_1 >= 10 && $hwwp_3_enabled } { + gdb_test "disable 3" "" + set hwwp_3_enabled 0 + } + } } }