From patchwork Thu Jul 12 22:25:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 28357 Received: (qmail 44271 invoked by alias); 12 Jul 2018 22:25:48 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 44153 invoked by uid 89); 12 Jul 2018 22:25:47 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LAZY_DOMAIN_SECURITY, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=linuxlowc, linux-low.c, UD:linux-low.c, for_each_thread X-HELO: mx1.redhat.com Received: from mx3-rdu2.redhat.com (HELO mx1.redhat.com) (66.187.233.73) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 12 Jul 2018 22:25:45 +0000 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0C2284075744 for ; Thu, 12 Jul 2018 22:25:44 +0000 (UTC) Received: from localhost.localdomain (ovpn04.gateway.prod.ext.ams2.redhat.com [10.39.146.4]) by smtp.corp.redhat.com (Postfix) with ESMTP id 958791C665 for ; Thu, 12 Jul 2018 22:25:43 +0000 (UTC) From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 1/2] GDBserver: Pass process_info pointer to target_detach and target_join Date: Thu, 12 Jul 2018 23:25:40 +0100 Message-Id: <20180712222541.16229-2-palves@redhat.com> In-Reply-To: <20180712222541.16229-1-palves@redhat.com> References: <20180712222541.16229-1-palves@redhat.com> We start from a process_info pointer, pass down process->pid, and then the target_detach and target_join implementations need to find the process from the pid again. Pass the process_info pointer down directly instead. gdb/gdbserver/ChangeLog: yyyy-mm-dd Pedro Alves * linux-low.c (linux_detach, linux_join): Change parameter to process_info pointer instead of pid. Adjust. * lynx-low.c (lynx_detach, lynx_join): Likewise. * nto-low.c (nto_detach): Likewise. * spu-low.c (spu_detach, spu_join): Likewise. * win32-low.c (win32_detach, win32_join): Likewise. * server.c (handle_detach, detach_or_kill_for_exit): Adjust. * target.h (struct target_ops) : Change parameter to process_info pointer instead of pid. Adjust all implementations and callers. (detach_inferior, join_inferior): Rename 'pid' parameter to 'proc'. --- gdb/gdbserver/linux-low.c | 15 +++++---------- gdb/gdbserver/lynx-low.c | 11 +++-------- gdb/gdbserver/nto-low.c | 2 +- gdb/gdbserver/server.c | 6 +++--- gdb/gdbserver/spu-low.c | 12 ++++-------- gdb/gdbserver/target.h | 17 +++++++++-------- gdb/gdbserver/win32-low.c | 14 +++++++------- 7 files changed, 32 insertions(+), 45 deletions(-) diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 7c396ae366..dfa7fbaa49 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -1608,15 +1608,10 @@ linux_detach_lwp_callback (thread_info *thread) } static int -linux_detach (int pid) +linux_detach (process_info *process) { - struct process_info *process; struct lwp_info *main_lwp; - process = find_process_pid (pid); - if (process == NULL) - return -1; - /* As there's a step over already in progress, let it finish first, otherwise nesting a stabilize_threads operation on top gets real messy. */ @@ -1638,9 +1633,9 @@ linux_detach (int pid) /* Detach from the clone lwps first. If the thread group exits just while we're detaching, we must reap the clone lwps before we're able to reap the leader. */ - for_each_thread (pid, linux_detach_lwp_callback); + for_each_thread (process->pid, linux_detach_lwp_callback); - main_lwp = find_lwp_pid (ptid_t (pid)); + main_lwp = find_lwp_pid (ptid_t (process->pid)); linux_detach_one_lwp (main_lwp); the_target->mourn (process); @@ -1680,12 +1675,12 @@ linux_mourn (struct process_info *process) } static void -linux_join (int pid) +linux_join (process_info *proc) { int status, ret; do { - ret = my_waitpid (pid, &status, 0); + ret = my_waitpid (proc->pid, &status, 0); if (WIFEXITED (status) || WIFSIGNALED (status)) break; } while (ret != -1 || errno != ECHILD); diff --git a/gdb/gdbserver/lynx-low.c b/gdb/gdbserver/lynx-low.c index b68bbeaf20..902a70386b 100644 --- a/gdb/gdbserver/lynx-low.c +++ b/gdb/gdbserver/lynx-low.c @@ -541,14 +541,9 @@ lynx_kill (int pid) /* Implement the detach target_ops method. */ static int -lynx_detach (int pid) +lynx_detach (process_info *process) { - ptid_t ptid = lynx_ptid_t (pid, 0); - struct process_info *process; - - process = find_process_pid (pid); - if (process == NULL) - return -1; + ptid_t ptid = lynx_ptid_t (process->pid, 0); lynx_ptrace (PTRACE_DETACH, ptid, 0, 0, 0); the_target->mourn (process); @@ -572,7 +567,7 @@ lynx_mourn (struct process_info *proc) /* Implement the join target_ops method. */ static void -lynx_join (int pid) +lynx_join (process_info *proc) { /* The PTRACE_DETACH is sufficient to detach from the process. So no need to do anything extra. */ diff --git a/gdb/gdbserver/nto-low.c b/gdb/gdbserver/nto-low.c index 236e555714..46e96449a1 100644 --- a/gdb/gdbserver/nto-low.c +++ b/gdb/gdbserver/nto-low.c @@ -408,7 +408,7 @@ nto_kill (int pid) /* Detach from process PID. */ static int -nto_detach (int pid) +nto_detach (process_info *proc) { TRACE ("%s %d\n", __func__, pid); do_detach (); diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index bf6302ba2d..b35015b7bf 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -1255,7 +1255,7 @@ handle_detach (char *own_buf) fprintf (stderr, "Detaching from process %d\n", process->pid); stop_tracing (); - if (detach_inferior (process->pid) != 0) + if (detach_inferior (process) != 0) write_enn (own_buf); else { @@ -1281,7 +1281,7 @@ handle_detach (char *own_buf) /* If we are attached, then we can exit. Otherwise, we need to hang around doing nothing, until the child is gone. */ - join_inferior (process->pid); + join_inferior (process); exit (0); } } @@ -3526,7 +3526,7 @@ detach_or_kill_for_exit (void) int pid = process->pid; if (process->attached) - detach_inferior (pid); + detach_inferior (process); else kill_inferior (pid); diff --git a/gdb/gdbserver/spu-low.c b/gdb/gdbserver/spu-low.c index e9fc6e7beb..c2a8734f68 100644 --- a/gdb/gdbserver/spu-low.c +++ b/gdb/gdbserver/spu-low.c @@ -348,13 +348,9 @@ spu_kill (int pid) /* Detach from inferior process. */ static int -spu_detach (int pid) +spu_detach (process_info *process) { - struct process_info *process = find_process_pid (pid); - if (process == NULL) - return -1; - - ptrace (PTRACE_DETACH, pid, 0, 0); + ptrace (PTRACE_DETACH, process->pid, 0, 0); clear_inferiors (); remove_process (process); @@ -368,12 +364,12 @@ spu_mourn (struct process_info *process) } static void -spu_join (int pid) +spu_join (process_info *proc) { int status, ret; do { - ret = waitpid (pid, &status, 0); + ret = waitpid (proc->pid, &status, 0); if (WIFEXITED (status) || WIFSIGNALED (status)) break; } while (ret != -1 || errno != ECHILD); diff --git a/gdb/gdbserver/target.h b/gdb/gdbserver/target.h index 25accd2207..7f59485580 100644 --- a/gdb/gdbserver/target.h +++ b/gdb/gdbserver/target.h @@ -94,17 +94,18 @@ struct target_ops int (*kill) (int pid); - /* Detach from inferior PID. Return -1 on failure, and 0 on + /* Detach from process PROC. Return -1 on failure, and 0 on success. */ - int (*detach) (int pid); + int (*detach) (process_info *proc); /* The inferior process has died. Do what is right. */ void (*mourn) (struct process_info *proc); - /* Wait for inferior PID to exit. */ - void (*join) (int pid); + /* Wait for process PROC to exit. */ + + void (*join) (process_info *proc); /* Return 1 iff the thread with process ID PID is alive. */ @@ -517,8 +518,8 @@ int kill_inferior (int); (*the_target->handle_new_gdb_connection) (); \ } while (0) -#define detach_inferior(pid) \ - (*the_target->detach) (pid) +#define detach_inferior(proc) \ + (*the_target->detach) (proc) #define mythread_alive(pid) \ (*the_target->thread_alive) (pid) @@ -529,8 +530,8 @@ int kill_inferior (int); #define store_inferior_registers(regcache, regno) \ (*the_target->store_registers) (regcache, regno) -#define join_inferior(pid) \ - (*the_target->join) (pid) +#define join_inferior(proc) \ + (*the_target->join) (proc) #define target_supports_non_stop() \ (the_target->supports_non_stop ? (*the_target->supports_non_stop ) () : 0) diff --git a/gdb/gdbserver/win32-low.c b/gdb/gdbserver/win32-low.c index 8a20972bd4..17729a83cc 100644 --- a/gdb/gdbserver/win32-low.c +++ b/gdb/gdbserver/win32-low.c @@ -834,11 +834,11 @@ win32_kill (int pid) return 0; } -/* Detach from inferior PID. */ +/* Implementation of target_ops::detach. */ + static int -win32_detach (int pid) +win32_detach (process_info *process) { - struct process_info *process; winapi_DebugActiveProcessStop DebugActiveProcessStop = NULL; winapi_DebugSetProcessKillOnExit DebugSetProcessKillOnExit = NULL; #ifdef _WIN32_WCE @@ -865,7 +865,6 @@ win32_detach (int pid) return -1; DebugSetProcessKillOnExit (FALSE); - process = find_process_pid (pid); remove_process (process); win32_clear_inferiors (); @@ -878,11 +877,12 @@ win32_mourn (struct process_info *process) remove_process (process); } -/* Wait for inferiors to end. */ +/* Implementation of target_ops::join. */ + static void -win32_join (int pid) +win32_join (process_info *proc) { - HANDLE h = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid); + HANDLE h = OpenProcess (PROCESS_ALL_ACCESS, FALSE, proc->pid); if (h != NULL) { WaitForSingleObject (h, INFINITE);