remote.c/all-stop: Implement TARGET_WAITKIND_NO_RESUMED and TARGET_WNOHANG
authorPedro Alves <palves@redhat.com>
Fri, 7 Aug 2015 16:23:56 +0000 (17:23 +0100)
committerPedro Alves <palves@redhat.com>
Fri, 7 Aug 2015 16:23:56 +0000 (17:23 +0100)
Even though "target remote" supports target-async, the all-stop
target_wait implementation ignores TARGET_WNOHANG.  If the core
happens to poll for events and we've already read the stop reply out
of the serial/socket, remote_wait_as hangs forever instead of
returning an indication that there are no events to process.  This
can't happen currently, but later changes will trigger this.

gdb/ChangeLog:
2015-08-07  Pedro Alves  <palves@redhat.com>

* remote.c (remote_wait_as): If not waiting for a stop reply,
return TARGET_WAITKIND_NO_RESUMED.  If TARGET_WNOHANG is
requested, don't block waiting forever.

gdb/ChangeLog
gdb/remote.c

index 7bec9c81759c33c466ab4e8c4c77d4e474cf969c..5bf3d75c184e80ad552182ee470704cf298120bb 100644 (file)
@@ -1,3 +1,9 @@
+2015-08-07  Pedro Alves  <palves@redhat.com>
+
+       * remote.c (remote_wait_as): If not waiting for a stop reply,
+       return TARGET_WAITKIND_NO_RESUMED.  If TARGET_WNOHANG is
+       requested, don't block waiting forever.
+
 2015-08-07  Pedro Alves  <pedro@codesourcery.com>
 
        * infrun.c (adjust_pc_after_break): Now takes thread_info and
index c047f35118dd84eb9f87e5b17201b823681570f1..4b5eb8ed8c9f1ee0e64b36cce6081b3f1f1cab26 100644 (file)
@@ -6267,6 +6267,14 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options)
     {
       int ret;
       int is_notif;
+      int forever = ((options & TARGET_WNOHANG) == 0
+                    && wait_forever_enabled_p);
+
+      if (!rs->waiting_for_stop_reply)
+       {
+         status->kind = TARGET_WAITKIND_NO_RESUMED;
+         return minus_one_ptid;
+       }
 
       if (!target_is_async_p ())
        {
@@ -6285,7 +6293,7 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options)
         However, before we do that we need to ensure that the caller
         knows how to take the target into/out of async mode.  */
       ret = getpkt_or_notif_sane (&rs->buf, &rs->buf_size,
-                                 wait_forever_enabled_p, &is_notif);
+                                 forever, &is_notif);
 
       if (!target_is_async_p ())
        signal (SIGINT, ofunc);
@@ -6294,6 +6302,9 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options)
         not interesting.  */
       if (ret != -1 && is_notif)
        return minus_one_ptid;
+
+      if (ret == -1 && (options & TARGET_WNOHANG) != 0)
+       return minus_one_ptid;
     }
 
   buf = rs->buf;