diff options
-rw-r--r-- | gdb/linux-nat.c | 76 |
1 files changed, 40 insertions, 36 deletions
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 656a097..2f8cf49 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -1234,6 +1234,45 @@ linux_nat_target::attach (const char *args, int from_tty) target_async (1); } +/* Ptrace-detach the thread with pid PID. */ + +static void +detach_one_pid (int pid, int signo) +{ + if (ptrace (PTRACE_DETACH, pid, 0, signo) < 0) + { + int save_errno = errno; + + /* We know the thread exists, so ESRCH must mean the lwp is + zombie. This can happen if one of the already-detached + threads exits the whole thread group. In that case we're + still attached, and must reap the lwp. */ + if (save_errno == ESRCH) + { + int ret, status; + + ret = my_waitpid (pid, &status, __WALL); + if (ret == -1) + { + warning (_("Couldn't reap LWP %d while detaching: %s"), + pid, safe_strerror (errno)); + } + else if (!WIFEXITED (status) && !WIFSIGNALED (status)) + { + warning (_("Reaping LWP %d while detaching " + "returned unexpected status 0x%x"), + pid, status); + } + } + else + error (_("Can't detach %d: %s"), + pid, safe_strerror (save_errno)); + } + else + linux_nat_debug_printf ("PTRACE_DETACH (%d, %s, 0) (OK)", + pid, strsignal (signo)); +} + /* Get pending signal of THREAD as a host signal number, for detaching purposes. This is the signal the thread last stopped for, which we need to deliver to the thread when detaching, otherwise, it'd be @@ -1364,42 +1403,7 @@ detach_one_lwp (struct lwp_info *lp, int *signo_p) throw; } - if (ptrace (PTRACE_DETACH, lwpid, 0, signo) < 0) - { - int save_errno = errno; - - /* We know the thread exists, so ESRCH must mean the lwp is - zombie. This can happen if one of the already-detached - threads exits the whole thread group. In that case we're - still attached, and must reap the lwp. */ - if (save_errno == ESRCH) - { - int ret, status; - - ret = my_waitpid (lwpid, &status, __WALL); - if (ret == -1) - { - warning (_("Couldn't reap LWP %d while detaching: %s"), - lwpid, safe_strerror (errno)); - } - else if (!WIFEXITED (status) && !WIFSIGNALED (status)) - { - warning (_("Reaping LWP %d while detaching " - "returned unexpected status 0x%x"), - lwpid, status); - } - } - else - { - error (_("Can't detach %s: %s"), - target_pid_to_str (lp->ptid).c_str (), - safe_strerror (save_errno)); - } - } - else - linux_nat_debug_printf ("PTRACE_DETACH (%s, %s, 0) (OK)", - target_pid_to_str (lp->ptid).c_str (), - strsignal (signo)); + detach_one_pid (lwpid, signo); delete_lwp (lp->ptid); } |