[rfc/testsuite/mi/thread] fix call to sleep in pthreads.c

Michael Elizabeth Chastain mec@shout.net
Wed Nov 5 17:56:00 GMT 2003

This patch changes gdb.mi/pthreads.c so that it gives repeatable results
under gdb.

Currently, the gdb.mi/mi*-pthreads.exp tests give irregular results
because the call to sleep() will often return prematurely.  Thus, many
of the threads exit before the test script can see them.  All the
results are PASS, but there are different PASSes on different test runs.

With this patch, all the threads live as long as they are intended to
live, so that the test script sees all the threads.

This patch has a disadvantage.  gdb is supposed to work with all kinds
of inferior programs, not just well-written inferior programs.
Arguably, I should live pthreads.c alone, and change the *.exp files to
be more flexible about what they recognize.

I thought about that approach and decided that I like it better if the
test program covers what it is intended to cover (thread backtraces)
even at the expense of other coverage (of nothing particularly useful).
Also, gdb.threads/pthreads.c still has the broken call to sleep()
with no return value checking, so we do still have an instance of this
programming idiom in the test corpus.

My motivation for doing this is that I'm processing two million
test results on every spin, so the more uniform and regular they are,
the less work I have to do.  This also helps anyone who compares
test runs with 'diff' or with Andrew's script.

Testing: I'm in the process of testing this.  So far it looks okay
but I won't say anything until the test bed finishes.

Anyways ... comments?

Michael C

2003-11-05  Michael Chastain  <mec@shout.net>

	* gdb.mi/pthreads.c (routine): Handle early return from sleep.

Index: pthreads.c
RCS file: /cvs/src/src/gdb/testsuite/gdb.mi/pthreads.c,v
retrieving revision 1.4
diff -c -3 -p -r1.4 pthreads.c
*** pthreads.c	24 Oct 2003 19:55:09 -0000	1.4
--- pthreads.c	5 Nov 2003 17:43:00 -0000
*************** static pthread_attr_t null_attr;
*** 42,48 ****
  void *
  routine (void *arg)
!   sleep (9);
    printf ("hello thread\n");
--- 42,55 ----
  void *
  routine (void *arg)
!   /* When gdb is running, it sets hidden breakpoints in the thread
!      library.  The signals caused by these hidden breakpoints can
!      cause system calls such as 'sleep' to return early.  Pay attention
!      to the return value from 'sleep' to get the full sleep.  */
!   int unslept = 9;
!   while (unslept > 0)
!     unslept = sleep (unslept);
    printf ("hello thread\n");

More information about the Gdb-patches mailing list