linux-nat.c: always mark execing LWP as resumed
authorPedro Alves <palves@redhat.com>
Mon, 29 Dec 2014 19:41:06 +0000 (19:41 +0000)
committerPedro Alves <palves@redhat.com>
Fri, 9 Jan 2015 14:41:15 +0000 (14:41 +0000)
A subsequent patch will make the Linux backend's target_wait method
pull all events out of the kernel (with waitpid) and store them as
pending status in the LWP structure if no pending status was already
available.  Then, the backend goes over the pending statuses and pick
one to report to the core.

With that, the existing thread-execl.exp test exposes a bug, like:

 (gdb) set scheduler-locking on
 (gdb) PASS: gdb.threads/thread-execl.exp: schedlock on: set scheduler-locking on
 next
 FAIL: gdb.threads/thread-execl.exp: schedlock on: get to main in new image (timeout)

Recall that when the non-leader thread execs, all threads in the
process die, the execing thread changes its pid to the tgid, and then
waitpid returns an exec event to the tgid.  If GDB didn't resume the
leader LWP, then GDB sees an event for an LWP that was supposedly
stopped, and thus not marked as resumed.  Because the code that picks
a pending event to report to the core ignores not-resumed LWPs:

 /* Return non-zero if LP has a wait status pending.  */

 static int
 status_callback (struct lwp_info *lp, void *data)
 {
   /* Only report a pending wait status if we pretend that this has
      indeed been resumed.  */
   if (!lp->resumed)
     return 0;

the event ends up pending forever, thus the timeout.

gdb/
2015-01-09  Pedro Alves  <palves@redhat.com>

* linux-nat.c (linux_handle_extended_wait) <PTRACE_EVENT_EXEC>:
Set the LWP's 'resumed' flag.

gdb/ChangeLog
gdb/linux-nat.c

index 8c7c13b57f83a01a218a9226a4491608fe3e509c..ab18b40b44100e5d725e2bf2a75753245e23c6f3 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-09  Pedro Alves  <palves@redhat.com>
+
+       * linux-nat.c (linux_handle_extended_wait) <PTRACE_EVENT_EXEC>:
+       Set the LWP's 'resumed' flag.
+
 2015-01-09  Pedro Alves  <palves@redhat.com>
 
        * linux-nat.c (linux_resume_one_lwp): New function.
index 2097cb92b715e4afcc3c600daff93a46e5863114..e2601e0dee69e06195d29365d64534bd5166c321 100644 (file)
@@ -2085,6 +2085,10 @@ linux_handle_extended_wait (struct lwp_info *lp, int status,
       ourstatus->value.execd_pathname
        = xstrdup (linux_child_pid_to_exec_file (NULL, pid));
 
+      /* The thread that execed must have been resumed, but, when a
+        thread execs, it changes its tid to the tgid, and the old
+        tgid thread might have not been resumed.  */
+      lp->resumed = 1;
       return 0;
     }