mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-30 12:44:10 +08:00
gdb/linux-nat: factor ptrace-detach code to new detach_one_pid function
The following patch will add some code paths that need to ptrace-detach a given PID. Factor out the code that does this and put it in its own function, so that it can be re-used. Change-Id: Ie65ca0d89893b41aea0a23d9fc6ffbed042a9705
This commit is contained in:
parent
7b961964f8
commit
4a3ee32a40
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user