[binutils-gdb] Revert "do_target_wait_1: Clear TARGET_WNOHANG if the target isn't async."

Simon Marchi simark@sourceware.org
Thu Feb 24 19:15:45 GMT 2022


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=7124770976d3f051532faf864013b76ab36249bf

commit 7124770976d3f051532faf864013b76ab36249bf
Author: John Baldwin <jhb@FreeBSD.org>
Date:   Tue Feb 22 11:22:14 2022 -0800

    Revert "do_target_wait_1: Clear TARGET_WNOHANG if the target isn't async."
    
    Commit 14b3360508b1 ("do_target_wait_1: Clear
    TARGET_WNOHANG if the target isn't async.") broke some multi-target
    tests, such as gdb.multi/multi-target-info-inferiors.exp.  The symptom
    is that execution just hangs at some point.  What happens is:
    
    1. One remote inferior is started, and now sits stopped at a breakpoint.
       It is not "async" at this point (but it "can async").
    
    2. We run a native inferior, the event loop gets woken up by the native
       target's fd.
    
    3. In do_target_wait, we randomly choose an inferior to call target_wait
       on first, it happens to be the remote inferior.
    
    4. Because the target is currently not "async", we clear
       TARGET_WNOHANG, resulting in synchronous wait.  We therefore block
       here:
    
      #0  0x00007fe9540dbb4d in select () from /usr/lib/libc.so.6
      #1  0x000055fc7e821da7 in gdb_select (n=15, readfds=0x7ffdb77c1fb0, writefds=0x0, exceptfds=0x7ffdb77c2050, timeout=0x7ffdb77c1f90) at /home/simark/src/binutils-gdb/gdb/posix-hdep.c:31
      #2  0x000055fc7ddef905 in interruptible_select (n=15, readfds=0x7ffdb77c1fb0, writefds=0x0, exceptfds=0x7ffdb77c2050, timeout=0x7ffdb77c1f90) at /home/simark/src/binutils-gdb/gdb/event-top.c:1134
      #3  0x000055fc7eda58e4 in ser_base_wait_for (scb=0x6250002e4100, timeout=1) at /home/simark/src/binutils-gdb/gdb/ser-base.c:240
      #4  0x000055fc7eda66ba in do_ser_base_readchar (scb=0x6250002e4100, timeout=-1) at /home/simark/src/binutils-gdb/gdb/ser-base.c:365
      #5  0x000055fc7eda6ff6 in generic_readchar (scb=0x6250002e4100, timeout=-1, do_readchar=0x55fc7eda663c <do_ser_base_readchar(serial*, int)>) at /home/simark/src/binutils-gdb/gdb/ser-base.c:444
      #6  0x000055fc7eda718a in ser_base_readchar (scb=0x6250002e4100, timeout=-1) at /home/simark/src/binutils-gdb/gdb/ser-base.c:471
      #7  0x000055fc7edb1ecd in serial_readchar (scb=0x6250002e4100, timeout=-1) at /home/simark/src/binutils-gdb/gdb/serial.c:393
      #8  0x000055fc7ec48b8f in remote_target::readchar (this=0x617000038780, timeout=-1) at /home/simark/src/binutils-gdb/gdb/remote.c:9446
      #9  0x000055fc7ec4da82 in remote_target::getpkt_or_notif_sane_1 (this=0x617000038780, buf=0x6170000387a8, forever=1, expecting_notif=1, is_notif=0x7ffdb77c24f0) at /home/simark/src/binutils-gdb/gdb/remote.c:9928
      #10 0x000055fc7ec4f045 in remote_target::getpkt_or_notif_sane (this=0x617000038780, buf=0x6170000387a8, forever=1, is_notif=0x7ffdb77c24f0) at /home/simark/src/binutils-gdb/gdb/remote.c:10037
      #11 0x000055fc7ec354d4 in remote_target::wait_ns (this=0x617000038780, ptid=..., status=0x7ffdb77c33c8, options=...) at /home/simark/src/binutils-gdb/gdb/remote.c:8147
      #12 0x000055fc7ec38aa1 in remote_target::wait (this=0x617000038780, ptid=..., status=0x7ffdb77c33c8, options=...) at /home/simark/src/binutils-gdb/gdb/remote.c:8337
      #13 0x000055fc7f1409ce in target_wait (ptid=..., status=0x7ffdb77c33c8, options=...) at /home/simark/src/binutils-gdb/gdb/target.c:2612
      #14 0x000055fc7e19da98 in do_target_wait_1 (inf=0x617000038080, ptid=..., status=0x7ffdb77c33c8, options=...) at /home/simark/src/binutils-gdb/gdb/infrun.c:3636
      #15 0x000055fc7e19e26b in operator() (__closure=0x7ffdb77c2f90, inf=0x617000038080) at /home/simark/src/binutils-gdb/gdb/infrun.c:3697
      #16 0x000055fc7e19f0c4 in do_target_wait (ecs=0x7ffdb77c33a0, options=...) at /home/simark/src/binutils-gdb/gdb/infrun.c:3716
      #17 0x000055fc7e1a31f7 in fetch_inferior_event () at /home/simark/src/binutils-gdb/gdb/infrun.c:4061
    
    Before the aforementioned commit, we would not have cleared
    TARGET_WNOHANG, the remote target's wait would have returned nothing,
    and we would have consumed the native target's event.
    
    After applying this revert, the testsuite state looks as good as before
    for me on Ubuntu 20.04 amd64.
    
    Change-Id: Ic17a1642935cabcc16c25cb6899d52e12c2f5c3f

Diff:
---
 gdb/infrun.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gdb/infrun.c b/gdb/infrun.c
index 17ec8b27fa4..5311822fcb8 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -3627,7 +3627,7 @@ do_target_wait_1 (inferior *inf, ptid_t ptid,
 
   /* We can't ask a non-async target to do a non-blocking wait, so this will be
      a blocking wait.  */
-  if (!target_is_async_p ())
+  if (!target_can_async_p ())
     options &= ~TARGET_WNOHANG;
 
   if (deprecated_target_wait_hook)


More information about the Gdb-cvs mailing list