Make ada_tasks_inferior_data::task_list an std::vector

This removes a VEC type.  It requires converting ada_tasks_inferior_data
to C++ (initializing fields, allocating with new).  It seems, however,
that the allocated ada_tasks_inferior_data structures are never freed
(that should be fixed separately).

gdb/ChangeLog:

	* ada-tasks.c (ada_task_info_s): Remove typedef.
	(DEF_VEC_O(ada_task_info_s)): Remove.
	(struct ada_tasks_inferior_data): Initialize fields.
	<task_list>: Make an std::vector.
	(get_ada_tasks_inferior_data): Allocate with new.
	(ada_get_task_number): Adjust.
	(get_task_number_from_id): Likewise.
	(valid_task_id): Likewise.
	(ada_get_task_info_from_ptid): Likewise.
	(iterate_over_live_ada_tasks): Likewise.
	(add_ada_task): Likewise.
	(read_known_tasks): Likewise.
	(ada_build_task_list): Likewise.
	(print_ada_task_info): Likewise.
	(info_task): Likewise.
	(task_command_1): Likewise.
This commit is contained in:
Simon Marchi 2018-08-26 11:56:41 -04:00
parent 39e7af3e4b
commit c645cda49e
2 changed files with 50 additions and 53 deletions

View file

@ -1,3 +1,22 @@
2018-08-26 Simon Marchi <simon.marchi@polymtl.ca>
* ada-tasks.c (ada_task_info_s): Remove typedef.
(DEF_VEC_O(ada_task_info_s)): Remove.
(struct ada_tasks_inferior_data): Initialize fields.
<task_list>: Make an std::vector.
(get_ada_tasks_inferior_data): Allocate with new.
(ada_get_task_number): Adjust.
(get_task_number_from_id): Likewise.
(valid_task_id): Likewise.
(ada_get_task_info_from_ptid): Likewise.
(iterate_over_live_ada_tasks): Likewise.
(add_ada_task): Likewise.
(read_known_tasks): Likewise.
(ada_build_task_list): Likewise.
(print_ada_task_info): Likewise.
(info_task): Likewise.
(task_command_1): Likewise.
2018-08-26 Simon Marchi <simon.marchi@polymtl.ca>
* ada-lang.c (add_angle_brackets): Return std::string.

View file

@ -161,9 +161,6 @@ struct ada_tasks_pspace_data
/* Key to our per-program-space data. */
static const struct program_space_data *ada_tasks_pspace_data_handle;
typedef struct ada_task_info ada_task_info_s;
DEF_VEC_O(ada_task_info_s);
/* The kind of data structure used by the runtime to store the list
of Ada tasks. */
@ -207,24 +204,24 @@ struct ada_tasks_inferior_data
and the known_tasks_addr is irrelevant;
- ADA_TASKS_ARRAY: The known_tasks is an array;
- ADA_TASKS_LIST: The known_tasks is a list. */
enum ada_known_tasks_kind known_tasks_kind;
enum ada_known_tasks_kind known_tasks_kind = ADA_TASKS_UNKNOWN;
/* The address of the known_tasks structure. This is where
the runtime stores the information for all Ada tasks.
The interpretation of this field depends on KNOWN_TASKS_KIND
above. */
CORE_ADDR known_tasks_addr;
CORE_ADDR known_tasks_addr = 0;
/* Type of elements of the known task. Usually a pointer. */
struct type *known_tasks_element;
struct type *known_tasks_element = nullptr;
/* Number of elements in the known tasks array. */
unsigned int known_tasks_length;
unsigned int known_tasks_length = 0;
/* When nonzero, this flag indicates that the task_list field
below is up to date. When set to zero, the list has either
not been initialized, or has potentially become stale. */
int task_list_valid_p;
int task_list_valid_p = 0;
/* The list of Ada tasks.
@ -233,7 +230,7 @@ struct ada_tasks_inferior_data
info listing displayed by "info tasks". This number is equal to
its index in the vector + 1. Reciprocally, to compute the index
of a task in the vector, we need to substract 1 from its number. */
VEC(ada_task_info_s) *task_list;
std::vector<ada_task_info> task_list;
};
/* Key to our per-inferior data. */
@ -281,7 +278,7 @@ get_ada_tasks_inferior_data (struct inferior *inf)
inferior_data (inf, ada_tasks_inferior_data_handle));
if (data == NULL)
{
data = XCNEW (struct ada_tasks_inferior_data);
data = new ada_tasks_inferior_data;
set_inferior_data (inf, ada_tasks_inferior_data_handle, data);
}
@ -294,15 +291,14 @@ get_ada_tasks_inferior_data (struct inferior *inf)
int
ada_get_task_number (thread_info *thread)
{
int i;
struct inferior *inf = thread->inf;
struct ada_tasks_inferior_data *data;
gdb_assert (inf != NULL);
data = get_ada_tasks_inferior_data (inf);
for (i = 0; i < VEC_length (ada_task_info_s, data->task_list); i++)
if (VEC_index (ada_task_info_s, data->task_list, i)->ptid == thread->ptid)
for (int i = 0; i < data->task_list.size (); i++)
if (data->task_list[i].ptid == thread->ptid)
return i + 1;
return 0; /* No matching task found. */
@ -315,14 +311,10 @@ static int
get_task_number_from_id (CORE_ADDR task_id, struct inferior *inf)
{
struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
int i;
for (i = 0; i < VEC_length (ada_task_info_s, data->task_list); i++)
for (int i = 0; i < data->task_list.size (); i++)
{
struct ada_task_info *task_info =
VEC_index (ada_task_info_s, data->task_list, i);
if (task_info->task_id == task_id)
if (data->task_list[i].task_id == task_id)
return i + 1;
}
@ -339,8 +331,7 @@ valid_task_id (int task_num)
ada_build_task_list ();
data = get_ada_tasks_inferior_data (current_inferior ());
return (task_num > 0
&& task_num <= VEC_length (ada_task_info_s, data->task_list));
return task_num > 0 && task_num <= data->task_list.size ();
}
/* Return non-zero iff the task STATE corresponds to a non-terminated
@ -358,19 +349,15 @@ ada_task_is_alive (struct ada_task_info *task_info)
struct ada_task_info *
ada_get_task_info_from_ptid (ptid_t ptid)
{
int i, nb_tasks;
struct ada_task_info *task;
struct ada_tasks_inferior_data *data;
ada_build_task_list ();
data = get_ada_tasks_inferior_data (current_inferior ());
nb_tasks = VEC_length (ada_task_info_s, data->task_list);
for (i = 0; i < nb_tasks; i++)
for (ada_task_info &task : data->task_list)
{
task = VEC_index (ada_task_info_s, data->task_list, i);
if (task->ptid == ptid)
return task;
if (task.ptid == ptid)
return &task;
}
return NULL;
@ -382,20 +369,16 @@ ada_get_task_info_from_ptid (ptid_t ptid)
void
iterate_over_live_ada_tasks (ada_task_list_iterator_ftype *iterator)
{
int i, nb_tasks;
struct ada_task_info *task;
struct ada_tasks_inferior_data *data;
ada_build_task_list ();
data = get_ada_tasks_inferior_data (current_inferior ());
nb_tasks = VEC_length (ada_task_info_s, data->task_list);
for (i = 0; i < nb_tasks; i++)
for (ada_task_info &task : data->task_list)
{
task = VEC_index (ada_task_info_s, data->task_list, i);
if (!ada_task_is_alive (task))
if (!ada_task_is_alive (&task))
continue;
iterator (task);
iterator (&task);
}
}
@ -801,7 +784,7 @@ add_ada_task (CORE_ADDR task_id, struct inferior *inf)
struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
read_atcb (task_id, &task_info);
VEC_safe_push (ada_task_info_s, data->task_list, &task_info);
data->task_list.push_back (task_info);
}
/* Read the Known_Tasks array from the inferior memory, and store
@ -974,7 +957,7 @@ read_known_tasks (void)
get_ada_tasks_inferior_data (current_inferior ());
/* Step 1: Clear the current list, if necessary. */
VEC_truncate (ada_task_info_s, data->task_list, 0);
data->task_list.clear ();
/* Step 2: do the real work.
If the application does not use task, then no more needs to be done.
@ -1018,7 +1001,7 @@ ada_build_task_list (void)
if (!data->task_list_valid_p)
read_known_tasks ();
return VEC_length (ada_task_info_s, data->task_list);
return data->task_list.size ();
}
/* Print a table providing a short description of all Ada tasks
@ -1062,14 +1045,13 @@ print_ada_task_info (struct ui_out *uiout,
as we have tasks. */
if (taskno_arg)
{
if (taskno_arg > 0
&& taskno_arg <= VEC_length (ada_task_info_s, data->task_list))
if (taskno_arg > 0 && taskno_arg <= data->task_list.size ())
nb_tasks = 1;
else
nb_tasks = 0;
}
else
nb_tasks = VEC_length (ada_task_info_s, data->task_list);
nb_tasks = data->task_list.size ();
nb_columns = uiout->is_mi_like_p () ? 8 : 7;
ui_out_emit_table table_emitter (uiout, nb_columns, nb_tasks, "tasks");
@ -1090,12 +1072,10 @@ print_ada_task_info (struct ui_out *uiout,
uiout->table_header (1, ui_noalign, "name", "Name");
uiout->table_body ();
for (taskno = 1;
taskno <= VEC_length (ada_task_info_s, data->task_list);
taskno++)
for (taskno = 1; taskno <= data->task_list.size (); taskno++)
{
const struct ada_task_info *const task_info =
VEC_index (ada_task_info_s, data->task_list, taskno - 1);
&data->task_list[taskno - 1];
int parent_id;
gdb_assert (task_info != NULL);
@ -1186,10 +1166,10 @@ info_task (struct ui_out *uiout, const char *taskno_str, struct inferior *inf)
return;
}
if (taskno <= 0 || taskno > VEC_length (ada_task_info_s, data->task_list))
if (taskno <= 0 || taskno > data->task_list.size ())
error (_("Task ID %d not known. Use the \"info tasks\" command to\n"
"see the IDs of currently known tasks"), taskno);
task_info = VEC_index (ada_task_info_s, data->task_list, taskno - 1);
task_info = &data->task_list[taskno - 1];
/* Print the Ada task ID. */
printf_filtered (_("Ada Task: %s\n"),
@ -1214,8 +1194,7 @@ info_task (struct ui_out *uiout, const char *taskno_str, struct inferior *inf)
parent_taskno = get_task_number_from_id (task_info->parent, inf);
if (parent_taskno)
{
struct ada_task_info *parent =
VEC_index (ada_task_info_s, data->task_list, parent_taskno - 1);
struct ada_task_info *parent = &data->task_list[parent_taskno - 1];
printf_filtered (_("Parent: %d"), parent_taskno);
if (parent->name[0] != '\0')
@ -1249,8 +1228,7 @@ info_task (struct ui_out *uiout, const char *taskno_str, struct inferior *inf)
if (target_taskno)
{
struct ada_task_info *target_task_info =
VEC_index (ada_task_info_s, data->task_list, target_taskno - 1);
ada_task_info *target_task_info = &data->task_list[target_taskno - 1];
if (target_task_info->name[0] != '\0')
printf_filtered (" (%s)", target_task_info->name);
@ -1301,10 +1279,10 @@ task_command_1 (const char *taskno_str, int from_tty, struct inferior *inf)
struct ada_task_info *task_info;
struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
if (taskno <= 0 || taskno > VEC_length (ada_task_info_s, data->task_list))
if (taskno <= 0 || taskno > data->task_list.size ())
error (_("Task ID %d not known. Use the \"info tasks\" command to\n"
"see the IDs of currently known tasks"), taskno);
task_info = VEC_index (ada_task_info_s, data->task_list, taskno - 1);
task_info = &data->task_list[taskno - 1];
if (!ada_task_is_alive (task_info))
error (_("Cannot switch to task %d: Task is no longer running"), taskno);