aboutsummaryrefslogtreecommitdiff
path: root/gdb/linux-nat.c
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2006-05-05 23:48:28 +0000
committerUlrich Weigand <uweigand@de.ibm.com>2006-05-05 23:48:28 +0000
commit6fc191037f479d3f16aaed43eec61a5bed77b2c0 (patch)
tree545db75c9eae9c48bc5cf6f00fb853f0b33ea646 /gdb/linux-nat.c
parentd539ed7ecddb3f5f62505e0d6a77a2a49c865432 (diff)
downloadgdb-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.c26
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;