Skip to content

Commit

Permalink
gdb/linux-nat: factor ptrace-detach code to new detach_one_pid function
Browse files Browse the repository at this point in the history
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
  • Loading branch information
simark committed Dec 9, 2021
1 parent 7b96196 commit 4a3ee32
Showing 1 changed file with 40 additions and 36 deletions.
76 changes: 40 additions & 36 deletions gdb/linux-nat.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);
}
Expand Down

0 comments on commit 4a3ee32

Please sign in to comment.