gdb/linux-nat: factor ptrace-detach code to new detach_one_pid function
authorSimon Marchi <simon.marchi@efficios.com>
Wed, 1 Dec 2021 14:40:02 +0000 (09:40 -0500)
committerSimon Marchi <simon.marchi@efficios.com>
Thu, 9 Dec 2021 02:00:39 +0000 (21:00 -0500)
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

gdb/linux-nat.c

index 656a0975dddfc6fd5f9c4156990338db6b77a8f1..2f8cf498b73c29f2b3d930e50fbaf803a27191cc 100644 (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);
 }