Fix memory leak in list_available_thread_groups

Commit

  C++ify osdata
  479f8de1b3

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.
This commit is contained in:
Simon Marchi 2017-11-23 21:56:19 -05:00 committed by Simon Marchi
parent 7e8006d14c
commit 00ea2e2ad3
2 changed files with 11 additions and 16 deletions

View File

@ -1,3 +1,8 @@
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> 2017-11-23 Simon Marchi <simon.marchi@ericsson.com>
* osdata.c (osdata_end_column, get_osdata): Remove std::move. * osdata.c (osdata_end_column, get_osdata): Remove std::move.

View 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. /* This keeps a map from integer (pid) to vector of struct osdata_item.
The vector contains information about all threads for the given pid. */ 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. */ /* get_osdata will throw if it cannot return data. */
std::unique_ptr<osdata> data = get_osdata ("processes"); 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"); const std::string *pid = get_osdata_column (item, "pid");
int pid_i = strtoul (pid->c_str (), NULL, 0); int pid_i = strtoul (pid->c_str (), NULL, 0);
std::vector<osdata_item> *vec;
auto n = tree_.find (pid_i); tree[pid_i].push_back (item);
if (n == tree_.end ())
{
vec = new std::vector<osdata_item>;
tree_[pid_i] = vec;
}
else
vec = n->second;
vec->push_back (item);
} }
} }
@ -774,14 +764,14 @@ list_available_thread_groups (const std::set<int> &ids, int recurse)
if (recurse) if (recurse)
{ {
auto n = tree_.find (pid_i); auto n = tree.find (pid_i);
if (n != tree_.end ()) 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"); 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); ui_out_emit_tuple tuple_emitter (uiout, NULL);
const std::string *tid = get_osdata_column (child, "tid"); const std::string *tid = get_osdata_column (child, "tid");