From e8c6b620f70d8cced4a93d8857ad2a57f08a361a Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Wed, 9 Aug 2017 15:24:46 -0700 Subject: [PATCH] Replace home-grown linked-lists in FreeBSD's native target with STL lists. FreeBSD's native target uses linked-lists to keep track of pending fork events and fake vfork done events. Replace the first list with std::list and the second with std::forward_list. gdb/ChangeLog: * fbsd-nat.c (struct fbsd_fork_info): Remove. (fbsd_pending_children): Use std::list. (fbsd_remember_child): Likewise. (fbsd_is_child_pending): Likewise. (fbsd_pending_vfork_done): Use std::forward_list. (fbsd_add_vfork_done): Likewise. (fbsd_is_vfork_done_pending): Likewise. (fbsd_next_vfork_done): Likewise. --- gdb/ChangeLog | 11 ++++++++ gdb/fbsd-nat.c | 71 +++++++++++++++----------------------------------- 2 files changed, 32 insertions(+), 50 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0e28c0d9ab8..9918af1827d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2017-08-09 John Baldwin + + * fbsd-nat.c (struct fbsd_fork_info): Remove. + (fbsd_pending_children): Use std::list. + (fbsd_remember_child): Likewise. + (fbsd_is_child_pending): Likewise. + (fbsd_pending_vfork_done): Use std::forward_list. + (fbsd_add_vfork_done): Likewise. + (fbsd_is_vfork_done_pending): Likewise. + (fbsd_next_vfork_done): Likewise. + 2017-08-09 John Baldwin * fbsd-nat.c [HAVE_KINFO_GETVMMAP] (struct free_deleter): New. diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c index 721e72b85c4..c89343a24fe 100644 --- a/gdb/fbsd-nat.c +++ b/gdb/fbsd-nat.c @@ -41,6 +41,8 @@ #include "elf-bfd.h" #include "fbsd-nat.h" +#include + /* Return the name of a file that can be opened to get the symbols for the child process identified by PID. */ @@ -712,13 +714,7 @@ fbsd_update_thread_list (struct target_ops *ops) sake. FreeBSD versions newer than 9.1 contain both fixes. */ -struct fbsd_fork_info -{ - struct fbsd_fork_info *next; - ptid_t ptid; -}; - -static struct fbsd_fork_info *fbsd_pending_children; +static std::list fbsd_pending_children; /* Record a new child process event that is reported before the corresponding fork event in the parent. */ @@ -726,11 +722,7 @@ static struct fbsd_fork_info *fbsd_pending_children; static void fbsd_remember_child (ptid_t pid) { - struct fbsd_fork_info *info = XCNEW (struct fbsd_fork_info); - - info->ptid = pid; - info->next = fbsd_pending_children; - fbsd_pending_children = info; + fbsd_pending_children.push_front (pid); } /* Check for a previously-recorded new child process event for PID. @@ -739,39 +731,26 @@ fbsd_remember_child (ptid_t pid) static ptid_t fbsd_is_child_pending (pid_t pid) { - struct fbsd_fork_info *info, *prev; - ptid_t ptid; - - prev = NULL; - for (info = fbsd_pending_children; info; prev = info, info = info->next) - { - if (ptid_get_pid (info->ptid) == pid) - { - if (prev == NULL) - fbsd_pending_children = info->next; - else - prev->next = info->next; - ptid = info->ptid; - xfree (info); - return ptid; - } - } + for (auto it = fbsd_pending_children.begin (); + it != fbsd_pending_children.end (); it++) + if (it->pid () == pid) + { + ptid_t ptid = *it; + fbsd_pending_children.erase (it); + return ptid; + } return null_ptid; } #ifndef PTRACE_VFORK -static struct fbsd_fork_info *fbsd_pending_vfork_done; +static std::forward_list fbsd_pending_vfork_done; /* Record a pending vfork done event. */ static void fbsd_add_vfork_done (ptid_t pid) { - struct fbsd_fork_info *info = XCNEW (struct fbsd_fork_info); - - info->ptid = pid; - info->next = fbsd_pending_vfork_done; - fbsd_pending_vfork_done = info; + fbsd_pending_vfork_done.push_front (pid); } /* Check for a pending vfork done event for a specific PID. */ @@ -779,13 +758,10 @@ fbsd_add_vfork_done (ptid_t pid) static int fbsd_is_vfork_done_pending (pid_t pid) { - struct fbsd_fork_info *info; - - for (info = fbsd_pending_vfork_done; info != NULL; info = info->next) - { - if (ptid_get_pid (info->ptid) == pid) - return 1; - } + for (auto it = fbsd_pending_vfork_done.begin (); + it != fbsd_pending_vfork_done.end (); it++) + if (it->pid () == pid) + return 1; return 0; } @@ -795,15 +771,10 @@ fbsd_is_vfork_done_pending (pid_t pid) static ptid_t fbsd_next_vfork_done (void) { - struct fbsd_fork_info *info; - ptid_t ptid; - - if (fbsd_pending_vfork_done != NULL) + if (!fbsd_pending_vfork_done.empty ()) { - info = fbsd_pending_vfork_done; - fbsd_pending_vfork_done = info->next; - ptid = info->ptid; - xfree (info); + ptid_t ptid = fbsd_pending_vfork_done.front (); + fbsd_pending_vfork_done.pop_front (); return ptid; } return null_ptid; -- 2.30.2