diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2006-05-05 23:48:28 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@de.ibm.com> | 2006-05-05 23:48:28 +0000 |
commit | 6fc191037f479d3f16aaed43eec61a5bed77b2c0 (patch) | |
tree | 545db75c9eae9c48bc5cf6f00fb853f0b33ea646 /gdb/linux-nat.c | |
parent | d539ed7ecddb3f5f62505e0d6a77a2a49c865432 (diff) | |
download | gdb-6fc191037f479d3f16aaed43eec61a5bed77b2c0.zip gdb-6fc191037f479d3f16aaed43eec61a5bed77b2c0.tar.gz gdb-6fc191037f479d3f16aaed43eec61a5bed77b2c0.tar.bz2 |
* 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.
Diffstat (limited to 'gdb/linux-nat.c')
-rw-r--r-- | gdb/linux-nat.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 3cee912..5a80311 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -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; |