Remove make_cleanup_free_so
authorTom Tromey <tom@tromey.com>
Sat, 29 Apr 2017 04:43:54 +0000 (22:43 -0600)
committerTom Tromey <tom@tromey.com>
Thu, 3 Aug 2017 13:58:59 +0000 (07:58 -0600)
make_cleanup_free_so is used in a single spot.  This patch introduces
a unique pointer wrapper for struct so_list, and changes this spot to
use it.

ChangeLog
2017-08-03  Tom Tromey  <tom@tromey.com>

* utils.h (make_cleanup_free_so): Remove.
* utils.c (do_free_so, make_cleanup_free_so): Remove.
* solist.h (struct so_deleter): New.
(so_list_up): New typedef.
* solib-svr4.c (svr4_read_so_list): Use so_list_up.

gdb/ChangeLog
gdb/solib-svr4.c
gdb/solist.h
gdb/utils.c
gdb/utils.h

index d8dcb9fea5e2bed12256e70b9156371f8a94854c..62052645d3164e8daaa2f2c543eae3a942f5b6d3 100644 (file)
@@ -1,3 +1,11 @@
+2017-08-03  Tom Tromey  <tom@tromey.com>
+
+       * utils.h (make_cleanup_free_so): Remove.
+       * utils.c (do_free_so, make_cleanup_free_so): Remove.
+       * solist.h (struct so_deleter): New.
+       (so_list_up): New typedef.
+       * solib-svr4.c (svr4_read_so_list): Use so_list_up.
+
 2017-08-03  Tom Tromey  <tom@tromey.com>
 
        * utils.h (make_cleanup_restore_current_language): Remove.
index 080fd795ed48e70e86c6a7f1676e720e10d1d623..f99e2e2bf6d45406fb65d6755f0f4919e297197e 100644 (file)
@@ -1350,21 +1350,15 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
 
   for (; lm != 0; prev_lm = lm, lm = next_lm)
     {
-      struct so_list *newobj;
-      struct cleanup *old_chain;
       int errcode;
       char *buffer;
 
-      newobj = XCNEW (struct so_list);
-      old_chain = make_cleanup_free_so (newobj);
+      so_list_up newobj (XCNEW (struct so_list));
 
       lm_info_svr4 *li = lm_info_read (lm);
       newobj->lm_info = li;
       if (li == NULL)
-       {
-         do_cleanups (old_chain);
-         return 0;
-       }
+       return 0;
 
       next_lm = li->l_next;
 
@@ -1373,7 +1367,6 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
          warning (_("Corrupted shared library list: %s != %s"),
                   paddress (target_gdbarch (), prev_lm),
                   paddress (target_gdbarch (), li->l_prev));
-         do_cleanups (old_chain);
          return 0;
        }
 
@@ -1388,7 +1381,6 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
 
          first_l_name = li->l_name;
          info->main_lm_addr = li->lm_addr;
-         do_cleanups (old_chain);
          continue;
        }
 
@@ -1404,7 +1396,6 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
          if (first_l_name == 0 || li->l_name != first_l_name)
            warning (_("Can't read pathname for load map: %s."),
                     safe_strerror (errcode));
-         do_cleanups (old_chain);
          continue;
        }
 
@@ -1416,15 +1407,12 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm,
       /* If this entry has no name, or its name matches the name
         for the main executable, don't include it in the list.  */
       if (! newobj->so_name[0] || match_main (newobj->so_name))
-       {
-         do_cleanups (old_chain);
-         continue;
-       }
+       continue;
 
-      discard_cleanups (old_chain);
       newobj->next = 0;
-      **link_ptr_ptr = newobj;
-      *link_ptr_ptr = &newobj->next;
+      /* Don't free it now.  */
+      **link_ptr_ptr = newobj.release ();
+      *link_ptr_ptr = &(**link_ptr_ptr)->next;
     }
 
   return 1;
index 54c9902b4af6ae8301b89b171a77b26978d35754..5eb2d397f270d0ac1a0c98cf3d2e2e740fd3621a 100644 (file)
@@ -179,6 +179,18 @@ struct target_so_ops
 /* Free the memory associated with a (so_list *).  */
 void free_so (struct so_list *so);
 
+/* A deleter that calls free_so.  */
+struct so_deleter
+{
+  void operator() (struct so_list *so) const
+  {
+    free_so (so);
+  }
+};
+
+/* A unique pointer to a so_list.  */
+typedef std::unique_ptr<so_list, so_deleter> so_list_up;
+
 /* Return address of first so_list entry in master shared object list.  */
 struct so_list *master_so_list (void);
 
index ae7ad594ff915e6530b7b9bf977323678ed2e34b..06f4168e6e619b3586bc65ca424c8929401cec80 100644 (file)
@@ -268,24 +268,6 @@ make_cleanup_value_free (struct value *value)
   return make_cleanup (do_value_free, value);
 }
 
-/* Helper for make_cleanup_free_so.  */
-
-static void
-do_free_so (void *arg)
-{
-  struct so_list *so = (struct so_list *) arg;
-
-  free_so (so);
-}
-
-/* Make cleanup handler calling free_so for SO.  */
-
-struct cleanup *
-make_cleanup_free_so (struct so_list *so)
-{
-  return make_cleanup (do_free_so, so);
-}
-
 /* Helper function for make_cleanup_clear_parser_state.  */
 
 static void
index 63cc4759414dc81dc474c075b612d8b7556d8035..b9bd6d9b80ef7ac4613749f778a53c65d70c6580 100644 (file)
@@ -110,9 +110,6 @@ extern struct cleanup *make_cleanup_unpush_target (struct target_ops *ops);
 extern struct cleanup *make_cleanup_value_free_to_mark (struct value *);
 extern struct cleanup *make_cleanup_value_free (struct value *);
 
-struct so_list;
-extern struct cleanup *make_cleanup_free_so (struct so_list *so);
-
 /* A deleter for a hash table.  */
 struct htab_deleter
 {