Fix memory leak in list_available_thread_groups
authorSimon Marchi <simon.marchi@ericsson.com>
Fri, 24 Nov 2017 02:56:19 +0000 (21:56 -0500)
committerSimon Marchi <simon.marchi@polymtl.ca>
Fri, 24 Nov 2017 02:56:19 +0000 (21:56 -0500)
Commit

  C++ify osdata
  479f8de1b3b7e69ca8d557bbe9d843c7d1bc89c5

introduced a memory leak.  We allocate std::vectors and insert them in a
map, but never free them.  Instead, the map value type can be
std::vector objects directly.

gdb/ChangeLog:

* mi/mi-main.c (list_available_thread_groups): Change map value
type to std::vector.

gdb/ChangeLog
gdb/mi/mi-main.c

index bb3bf4e..ef19cf4 100644 (file)
@@ -1,5 +1,10 @@
 2017-11-23  Simon Marchi  <simon.marchi@ericsson.com>
 
+       * mi/mi-main.c (list_available_thread_groups): Change map value
+       type to std::vector.
+
+2017-11-23  Simon Marchi  <simon.marchi@ericsson.com>
+
        * osdata.c (osdata_end_column, get_osdata): Remove std::move.
 
 2017-11-23  Simon Marchi  <simon.marchi@ericsson.com>
index c7db478..3ca3500 100644 (file)
@@ -716,7 +716,7 @@ list_available_thread_groups (const std::set<int> &ids, int recurse)
 
   /* This keeps a map from integer (pid) to vector of struct osdata_item.
      The vector contains information about all threads for the given pid.  */
-  std::map<int, std::vector<osdata_item> *> tree_;
+  std::map<int, std::vector<osdata_item>> tree;
 
   /* get_osdata will throw if it cannot return data.  */
   std::unique_ptr<osdata> data = get_osdata ("processes");
@@ -729,18 +729,8 @@ list_available_thread_groups (const std::set<int> &ids, int recurse)
        {
          const std::string *pid = get_osdata_column (item, "pid");
          int pid_i = strtoul (pid->c_str (), NULL, 0);
-         std::vector<osdata_item> *vec;
 
-         auto n = tree_.find (pid_i);
-         if (n == tree_.end ())
-           {
-             vec = new std::vector<osdata_item>;
-             tree_[pid_i] = vec;
-           }
-         else
-           vec = n->second;
-
-         vec->push_back (item);
+         tree[pid_i].push_back (item);
        }
     }
 
@@ -774,14 +764,14 @@ list_available_thread_groups (const std::set<int> &ids, int recurse)
 
       if (recurse)
        {
-         auto n = tree_.find (pid_i);
-         if (n != tree_.end ())
+         auto n = tree.find (pid_i);
+         if (n != tree.end ())
            {
-             std::vector<osdata_item> *children = n->second;
+             std::vector<osdata_item> &children = n->second;
 
              ui_out_emit_list thread_list_emitter (uiout, "threads");
 
-             for (const osdata_item &child : *children)
+             for (const osdata_item &child : children)
                {
                  ui_out_emit_tuple tuple_emitter (uiout, NULL);
                  const std::string *tid = get_osdata_column (child, "tid");