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:
Simon Marchi 2021-12-01 09:40:02 -05:00
parent 7b961964f8
commit 4a3ee32a40

View File

@ -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);
}