binutils-gdb/gdb/testsuite/gdb.threads
Philippe Waroquiers 7a81c1e2d4 Fix tid-reuse sometimes blocks for a very long (infinite?) time.
A failure that seems to cause a long/infinite time is the following:

For a not clear reason, tid-reuse.c spawner thread sometimes gets an error:
     tid-reuse: /bd/home/philippe/gdb/git/build_moreaa/gdb/testsuite/../../../moreaa/gdb/testsuite/gdb.threads/tid-reuse.c:58: spawner_thread_func: Assertion `rc == 0' failed.

which causes a SIGABRT to be trapped by gdb, and tid-reuse does not reach the
after_count breakpoint:
  Thread 2 "tid-reuse" received signal SIGABRT, Aborted.
  [Switching to Thread 0x7ffff7518700 (LWP 10368)]
  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
  51	../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
  (gdb) FAIL: gdb.threads/tid-reuse.exp: continue to breakpoint: after_count

After that, tid-reuse.exp gets the value of reuse_time, but this one kept its
initial value of -1 (as unsigned) :
  print reuse_time
  $1 = 4294967295
  (gdb) PASS: gdb.threads/tid-reuse.exp: get reuse_time

tid-reuse then dies, and the .exp script continues (with some FAIL)
till it executes:
  set timeout [expr $reuse_time * 2]

leading to the error:

  (gdb) ERROR: integer value too large to represent as non-long integer
      while executing
  "expect {
  -i exp8 -timeout 8589934590
          -re ".*A problem internal to GDB has been detected" {
              fail "$message (GDB internal error)"
              gdb_intern..."
      ("uplevel" body line 1)
      invoked from within
  "uplevel $body" ARITH IOVERFLOW {integer value too large to represent as non-long integer} integer value too large to represent as non-long integer
  ERROR: GDB process no longer exists

and then everything blocks.
This last 'GDB process no longer exists' is strange, as I still see the gdb
when this all blocks, e.g.
philippe 16058 31085  0 20:30 pts/15   00:00:00                         /bin/bash -c rootme=`pwd`; export rootme; srcdir=../../../binutils-gdb/gdb/testsuite ; export srcdir ; EXPECT=`if [
philippe 16386 16058  0 20:30 pts/15   00:00:00                           expect -- /usr/share/dejagnu/runtest.exp --status GDB_PARALLEL=yes --outdir=outputs/gdb.threads/tid-reuse gdb.thre
philippe 24848 16386  0 20:30 pts/20   00:00:00                             /bd/home/philippe/gdb/git/build_binutils-gdb/gdb/testsuite/../../gdb/gdb -nw -nx -data-directory /bd/home/philip

This patch gives a default value of 60, so that if ever something wrong happens
in tid-reuse, then the value retrieved by the .exp script stays in a reasonable
range.

Simon verified the patch by:
"I replaced the pthread_create call with the value 1 to simulate a
failure, and the test succeeds to fail quickly with your patch applied.
Without your patch, I get the infinite hang that you describe."

Compared to V1:
As suggested by Pedro, this version checks the pthread calls return
code (in particular of pthread_create) and reports the failure reason,
instead of just aborting.

gdb/testsuite/ChangeLog

2018-12-09  Philippe Waroquiers  <philippe.waroquiers@skynet.be>

	* gdb.threads/tid-reuse.c (REUSE_TIME_CAP): Declare as 60.
	(reuse_time): Initialize to REUSE_TIME_CAP.
	(check_rc): New function.
	(main): Use REUSE_TIME_CAP instead of hardcoded 60.
	Check pthread_create rc.
	(spawner_thread_func): Check pthread_create and pthread_join rc.
2018-12-09 09:24:27 +01:00
..
attach-into-signal.c
attach-into-signal.exp
attach-many-short-lived-threads.c
attach-many-short-lived-threads.exp
attach-slow-waitpid.c
attach-slow-waitpid.exp
attach-stopped.c
attach-stopped.exp
bp_in_thread.c
bp_in_thread.exp
break-while-running.c
break-while-running.exp
check-libthread-db.c
check-libthread-db.exp
clone-attach-detach.c
clone-attach-detach.exp
clone-new-thread-event.c
clone-new-thread-event.exp
clone-thread_db.c
clone-thread_db.exp
continue-pending-after-query.c
continue-pending-after-query.exp
continue-pending-status.c
continue-pending-status.exp
corethreads.c
corethreads.exp
create-fail.c
create-fail.exp
current-lwp-dead.c
current-lwp-dead.exp
dlopen-libpthread-lib.c
dlopen-libpthread.c
dlopen-libpthread.exp
execl1.c
execl.c
execl.exp
fork-child-threads.c
fork-child-threads.exp
fork-plus-threads.c
fork-plus-threads.exp
fork-thread-pending.c
fork-thread-pending.exp
forking-threads-plus-breakpoint.c
forking-threads-plus-breakpoint.exp
gcore-stale-thread.c
gcore-stale-thread.exp
gcore-thread.exp
hand-call-in-threads.c
hand-call-in-threads.exp
hand-call-new-thread.c
hand-call-new-thread.exp
ia64-sigill.c
ia64-sigill.exp
info-threads-cur-sal-2.c
info-threads-cur-sal.c
info-threads-cur-sal.exp
interrupt-while-step-over.c
interrupt-while-step-over.exp
interrupted-hand-call.c
interrupted-hand-call.exp
kill.c
kill.exp
killed.c
killed.exp
leader-exit.c
leader-exit.exp
linux-dp.c
linux-dp.exp
local-watch-wrong-thread.c
local-watch-wrong-thread.exp
manythreads.c
manythreads.exp
multi-create-ns-info-thr.exp
multi-create.c
multi-create.exp
multiple-step-overs.c
multiple-step-overs.exp
multiple-successive-infcall.c
multiple-successive-infcall.exp
names.c
names.exp
next-bp-other-thread.c
next-bp-other-thread.exp
next-while-other-thread-longjmps.c
next-while-other-thread-longjmps.exp
no-unwaited-for-left.c
no-unwaited-for-left.exp
non-ldr-exc-1.c
non-ldr-exc-1.exp
non-ldr-exc-2.c
non-ldr-exc-2.exp
non-ldr-exc-3.c
non-ldr-exc-3.exp
non-ldr-exc-4.c
non-ldr-exc-4.exp
non-ldr-exit.c
non-ldr-exit.exp
non-stop-fair-events.c
non-stop-fair-events.exp
pending-step.c
pending-step.exp
print-threads.c
print-threads.exp
process-dies-while-detaching.c
process-dies-while-detaching.exp
process-dies-while-handling-bp.c
process-dies-while-handling-bp.exp
pthread_cond_wait.c
pthread_cond_wait.exp
pthreads.c
pthreads.exp
queue-signal.c
queue-signal.exp
reconnect-signal.c
reconnect-signal.exp
schedlock.c
schedlock.exp
siginfo-threads.c
siginfo-threads.exp
signal-command-handle-nopass.c
signal-command-handle-nopass.exp
signal-command-multiple-signals-pending.c
signal-command-multiple-signals-pending.exp
signal-delivered-right-thread.c
signal-delivered-right-thread.exp
signal-sigtrap.c
signal-sigtrap.exp
signal-while-stepping-over-bp-other-thread.c
signal-while-stepping-over-bp-other-thread.exp
sigstep-threads.c
sigstep-threads.exp
sigthread.c
sigthread.exp
slow-waitpid.c
staticthreads.c
staticthreads.exp
step-bg-decr-pc-switch-thread.c
step-bg-decr-pc-switch-thread.exp
step-over-lands-on-breakpoint.c
step-over-lands-on-breakpoint.exp
step-over-trips-on-watchpoint.c
step-over-trips-on-watchpoint.exp
stepi-random-signal.c
stepi-random-signal.exp
switch-threads.c
switch-threads.exp
thread_check.c
thread_check.exp
thread_events.c
thread_events.exp
thread-execl.c
thread-execl.exp
thread-find.exp
thread-specific-bp.c
thread-specific-bp.exp
thread-specific.c
thread-specific.exp
thread-unwindonsignal.exp
threadapply.c
threadapply.exp
threxit-hop-specific.c
threxit-hop-specific.exp
tid-reuse.c Fix tid-reuse sometimes blocks for a very long (infinite?) time. 2018-12-09 09:24:27 +01:00
tid-reuse.exp
tls2.c
tls-core.c
tls-core.exp
tls-main.c
tls-nodebug-pie.c
tls-nodebug-pie.exp
tls-nodebug.c
tls-nodebug.exp
tls-shared.c
tls-shared.exp
tls-so_extern_main.c
tls-so_extern.c
tls-so_extern.exp
tls-var-main.c
tls-var.c
tls-var.exp
tls.c
tls.exp
watchpoint-fork-child.c
watchpoint-fork-mt.c
watchpoint-fork-parent.c
watchpoint-fork-st.c
watchpoint-fork.exp
watchpoint-fork.h
watchthreads2.c
watchthreads2.exp
watchthreads-reorder.c
watchthreads-reorder.exp
watchthreads.c
watchthreads.exp
wp-replication.c
wp-replication.exp