* linux-nat.c (exit_lwp): Fix NULL pointer access.
authorUlrich Weigand <uweigand@de.ibm.com>
Fri, 5 May 2006 23:48:28 +0000 (23:48 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Fri, 5 May 2006 23:48:28 +0000 (23:48 +0000)
(linux_nat_handle_extended): New parameter STOPPING.
(wait_lwp): Call it with STOPPING equals 1.
(linux_nat_wait): Call it with STOPPING equals 0.

gdb/ChangeLog
gdb/linux-nat.c

index 3d581b7668c4743acec51cec5f1ee1a5c9693eb9..def793c3e314b603fb6fd2db687e772a27410e19 100644 (file)
@@ -1,3 +1,10 @@
+2006-05-05  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * linux-nat.c (exit_lwp): Fix NULL pointer access.
+       (linux_nat_handle_extended): New parameter STOPPING.
+       (wait_lwp): Call it with STOPPING equals 1.
+       (linux_nat_wait): Call it with STOPPING equals 0.
+
 2006-05-05  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * linux-nat.c (linux_nat_wait): Do not short-cut reporting
index 3cee912250fdf48967b685b397bb96c73941b152..5a80311808d2fdf2d76f08d6e193b0080f7bc950 100644 (file)
@@ -900,10 +900,13 @@ exit_lwp (struct lwp_info *lp)
       struct thread_info *thr;
 
       thr = iterate_over_threads (find_thread_from_lwp, &lp->ptid);
-      if (thr && !ptid_equal (thr->ptid, inferior_ptid))
-       delete_thread (thr->ptid);
-      else
-       record_dead_thread (thr->ptid);
+      if (thr)
+       {
+         if (!ptid_equal (thr->ptid, inferior_ptid))
+           delete_thread (thr->ptid);
+         else
+           record_dead_thread (thr->ptid);
+       }
     }
 
   delete_lwp (lp->ptid);
@@ -1279,10 +1282,11 @@ kill_lwp (int lwpid, int signo)
    just pass off to linux_handle_extended_wait, but if it reports a
    clone event we need to add the new LWP to our list (and not report
    the trap to higher layers).  This function returns non-zero if
-   the event should be ignored and we should wait again.  */
+   the event should be ignored and we should wait again.  If STOPPING
+   is true, the new LWP remains stopped, otherwise it is continued.  */
 
 static int
-linux_nat_handle_extended (struct lwp_info *lp, int status)
+linux_nat_handle_extended (struct lwp_info *lp, int status, int stopping)
 {
   linux_handle_extended_wait (GET_LWP (lp->ptid), status,
                              &lp->waitstatus);
@@ -1294,7 +1298,11 @@ linux_nat_handle_extended (struct lwp_info *lp, int status)
       new_lp = add_lwp (BUILD_LWP (lp->waitstatus.value.related_pid,
                                   GET_PID (inferior_ptid)));
       new_lp->cloned = 1;
-      new_lp->stopped = 1;
+
+      if (stopping)
+       new_lp->stopped = 1;
+      else
+       ptrace (PTRACE_CONT, lp->waitstatus.value.related_pid, 0, 0);
 
       lp->waitstatus.kind = TARGET_WAITKIND_IGNORE;
 
@@ -1378,7 +1386,7 @@ wait_lwp (struct lwp_info *lp)
        fprintf_unfiltered (gdb_stdlog,
                            "WL: Handling extended status 0x%06x\n",
                            status);
-      if (linux_nat_handle_extended (lp, status))
+      if (linux_nat_handle_extended (lp, status, 1))
        return wait_lwp (lp);
     }
 
@@ -2023,7 +2031,7 @@ retry:
                fprintf_unfiltered (gdb_stdlog,
                                    "LLW: Handling extended status 0x%06x\n",
                                    status);
-             if (linux_nat_handle_extended (lp, status))
+             if (linux_nat_handle_extended (lp, status, 0))
                {
                  status = 0;
                  continue;