Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Tom de Vries via Gdb-patches <gdb-patches@sourceware.org>
To: gdb-patches@sourceware.org
Subject: [committed][gdb/testsuite] Fix interrupted sleep in multi-threaded test-cases
Date: Thu, 16 Sep 2021 14:28:10 +0200	[thread overview]
Message-ID: <20210916122809.GA13596@delia> (raw)

Hi,

When running test-case gdb.threads/continue-pending-status.exp with native, I
have:
...
(gdb) continue^M
Continuing.^M
PASS: gdb.threads/continue-pending-status.exp: attempt 0: continue for ctrl-c
^C^M
Thread 1 "continue-pendin" received signal SIGINT, Interrupt.^M
[Switching to Thread 0x7ffff7fc4740 (LWP 1276)]^M
0x00007ffff758e4c0 in __GI___nanosleep () at nanosleep.c:27^M
27        return SYSCALL_CANCEL (nanosleep, requested_time, remaining);^M
(gdb) PASS: gdb.threads/continue-pending-status.exp: attempt 0: caught interrupt
...
but with target board unix/-m32, I run into:
...
(gdb) continue^M
Continuing.^M
PASS: gdb.threads/continue-pending-status.exp: attempt 0: continue for ctrl-c
[Thread 0xf74aeb40 (LWP 31957) exited]^M
[Thread 0xf7cafb40 (LWP 31956) exited]^M
[Inferior 1 (process 31952) exited normally]^M
(gdb) Quit^M
...

The problem is that the sleep (300) call at the end of main is interrupted,
which causes the inferior to exit before the ctrl-c can be send.

This problem is described at "Interrupted System Calls" in the docs, and the
suggested solution (using a sleep loop) indeed fixes the problem.

Fix this instead using the more prevalent:
...
  alarm (300);
  ...
  while (1) sleep (1);
...
which is roughly equivalent because the sleep is called at the end of main,
but slightly better because it guards against hangs from the start rather than
from the end of main.

Likewise in gdb.base/watch_thread_num.exp.

Likewise in gdb.btrace/enable-running.exp, but use the sleep loop there,
because the sleep is not called at the end of main.

Tested on x86_64-linux.

Committed to trunk.

Thanks,
- Tom

[gdb/testsuite] Fix interrupted sleep in multi-threaded test-cases

---
 gdb/testsuite/gdb.base/watch_thread_num.c           | 7 ++++++-
 gdb/testsuite/gdb.btrace/enable-running.c           | 4 +++-
 gdb/testsuite/gdb.threads/continue-pending-status.c | 6 +++++-
 3 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/gdb/testsuite/gdb.base/watch_thread_num.c b/gdb/testsuite/gdb.base/watch_thread_num.c
index 9a6f825b844..46029cf1291 100644
--- a/gdb/testsuite/gdb.base/watch_thread_num.c
+++ b/gdb/testsuite/gdb.base/watch_thread_num.c
@@ -43,6 +43,8 @@ int main () {
     void *thread_result;
     long i;
 
+    alarm (180);
+
     pthread_barrier_init (&threads_started_barrier, NULL, NUM + 1);
 
     pthread_barrier_init (&threads_started_barrier2, NULL, 2);
@@ -61,7 +63,10 @@ int main () {
 
     pthread_join (threads[0], NULL);
 
-    sleep (180);  /* first child thread exited */
+    /* first child thread exited */
+
+    while (1)
+      sleep (1);
 
     exit (EXIT_SUCCESS);
 }
diff --git a/gdb/testsuite/gdb.btrace/enable-running.c b/gdb/testsuite/gdb.btrace/enable-running.c
index 8f76241a892..2db3b7d28cb 100644
--- a/gdb/testsuite/gdb.btrace/enable-running.c
+++ b/gdb/testsuite/gdb.btrace/enable-running.c
@@ -25,7 +25,9 @@ test (void *arg)
 {
   /* Let's hope this is long enough for GDB to enable tracing and check that
      everything is working as expected.  */
-  sleep (10);
+  int unslept = 10;
+  while (unslept > 0)
+    unslept = sleep (unslept);
 
   return arg;
 }
diff --git a/gdb/testsuite/gdb.threads/continue-pending-status.c b/gdb/testsuite/gdb.threads/continue-pending-status.c
index 53e5944a0a9..965a071fe32 100644
--- a/gdb/testsuite/gdb.threads/continue-pending-status.c
+++ b/gdb/testsuite/gdb.threads/continue-pending-status.c
@@ -41,6 +41,8 @@ main (void)
 {
   int i;
 
+  alarm (300);
+
   pthread_barrier_init (&barrier, NULL, NUM_THREADS);
 
   for (i = 0; i < NUM_THREADS; i++)
@@ -53,6 +55,8 @@ main (void)
       assert (res == 0);
     }
 
-  sleep (300);
+  while (1)
+    sleep (1);
+
   return 0;
 }

                 reply	other threads:[~2021-09-16 12:28 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210916122809.GA13596@delia \
    --to=gdb-patches@sourceware.org \
    --cc=tdevries@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox