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> 2018-08-26 Simon Marchi <simon.marchi@polymtl.ca>
* ada-lang.c (add_angle_brackets): Return std::string. * 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. */ /* Key to our per-program-space data. */
static const struct program_space_data *ada_tasks_pspace_data_handle; 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 /* The kind of data structure used by the runtime to store the list
of Ada tasks. */ of Ada tasks. */
@ -207,24 +204,24 @@ struct ada_tasks_inferior_data
and the known_tasks_addr is irrelevant; and the known_tasks_addr is irrelevant;
- ADA_TASKS_ARRAY: The known_tasks is an array; - ADA_TASKS_ARRAY: The known_tasks is an array;
- ADA_TASKS_LIST: The known_tasks is a list. */ - 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 address of the known_tasks structure. This is where
the runtime stores the information for all Ada tasks. the runtime stores the information for all Ada tasks.
The interpretation of this field depends on KNOWN_TASKS_KIND The interpretation of this field depends on KNOWN_TASKS_KIND
above. */ above. */
CORE_ADDR known_tasks_addr; CORE_ADDR known_tasks_addr = 0;
/* Type of elements of the known task. Usually a pointer. */ /* 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. */ /* 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 /* When nonzero, this flag indicates that the task_list field
below is up to date. When set to zero, the list has either below is up to date. When set to zero, the list has either
not been initialized, or has potentially become stale. */ not been initialized, or has potentially become stale. */
int task_list_valid_p; int task_list_valid_p = 0;
/* The list of Ada tasks. /* 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 info listing displayed by "info tasks". This number is equal to
its index in the vector + 1. Reciprocally, to compute the index 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. */ 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. */ /* 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)); inferior_data (inf, ada_tasks_inferior_data_handle));
if (data == NULL) 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); set_inferior_data (inf, ada_tasks_inferior_data_handle, data);
} }
@ -294,15 +291,14 @@ get_ada_tasks_inferior_data (struct inferior *inf)
int int
ada_get_task_number (thread_info *thread) ada_get_task_number (thread_info *thread)
{ {
int i;
struct inferior *inf = thread->inf; struct inferior *inf = thread->inf;
struct ada_tasks_inferior_data *data; struct ada_tasks_inferior_data *data;
gdb_assert (inf != NULL); gdb_assert (inf != NULL);
data = get_ada_tasks_inferior_data (inf); data = get_ada_tasks_inferior_data (inf);
for (i = 0; i < VEC_length (ada_task_info_s, data->task_list); i++) for (int i = 0; i < data->task_list.size (); i++)
if (VEC_index (ada_task_info_s, data->task_list, i)->ptid == thread->ptid) if (data->task_list[i].ptid == thread->ptid)
return i + 1; return i + 1;
return 0; /* No matching task found. */ return 0; /* No matching task found. */
@ -315,14 +311,10 @@ static int
get_task_number_from_id (CORE_ADDR task_id, struct inferior *inf) get_task_number_from_id (CORE_ADDR task_id, struct inferior *inf)
{ {
struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (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 = if (data->task_list[i].task_id == task_id)
VEC_index (ada_task_info_s, data->task_list, i);
if (task_info->task_id == task_id)
return i + 1; return i + 1;
} }
@ -339,8 +331,7 @@ valid_task_id (int task_num)
ada_build_task_list (); ada_build_task_list ();
data = get_ada_tasks_inferior_data (current_inferior ()); data = get_ada_tasks_inferior_data (current_inferior ());
return (task_num > 0 return task_num > 0 && task_num <= data->task_list.size ();
&& task_num <= VEC_length (ada_task_info_s, data->task_list));
} }
/* Return non-zero iff the task STATE corresponds to a non-terminated /* 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 * struct ada_task_info *
ada_get_task_info_from_ptid (ptid_t ptid) ada_get_task_info_from_ptid (ptid_t ptid)
{ {
int i, nb_tasks;
struct ada_task_info *task;
struct ada_tasks_inferior_data *data; struct ada_tasks_inferior_data *data;
ada_build_task_list (); ada_build_task_list ();
data = get_ada_tasks_inferior_data (current_inferior ()); 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)
if (task->ptid == ptid) return &task;
return task;
} }
return NULL; return NULL;
@ -382,20 +369,16 @@ ada_get_task_info_from_ptid (ptid_t ptid)
void void
iterate_over_live_ada_tasks (ada_task_list_iterator_ftype *iterator) 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; struct ada_tasks_inferior_data *data;
ada_build_task_list (); ada_build_task_list ();
data = get_ada_tasks_inferior_data (current_inferior ()); 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; 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); struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
read_atcb (task_id, &task_info); 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 /* 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 ()); get_ada_tasks_inferior_data (current_inferior ());
/* Step 1: Clear the current list, if necessary. */ /* 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. /* Step 2: do the real work.
If the application does not use task, then no more needs to be done. 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) if (!data->task_list_valid_p)
read_known_tasks (); 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 /* 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. */ as we have tasks. */
if (taskno_arg) if (taskno_arg)
{ {
if (taskno_arg > 0 if (taskno_arg > 0 && taskno_arg <= data->task_list.size ())
&& taskno_arg <= VEC_length (ada_task_info_s, data->task_list))
nb_tasks = 1; nb_tasks = 1;
else else
nb_tasks = 0; nb_tasks = 0;
} }
else 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; nb_columns = uiout->is_mi_like_p () ? 8 : 7;
ui_out_emit_table table_emitter (uiout, nb_columns, nb_tasks, "tasks"); 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_header (1, ui_noalign, "name", "Name");
uiout->table_body (); uiout->table_body ();
for (taskno = 1; for (taskno = 1; taskno <= data->task_list.size (); taskno++)
taskno <= VEC_length (ada_task_info_s, data->task_list);
taskno++)
{ {
const struct ada_task_info *const task_info = 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; int parent_id;
gdb_assert (task_info != NULL); gdb_assert (task_info != NULL);
@ -1186,10 +1166,10 @@ info_task (struct ui_out *uiout, const char *taskno_str, struct inferior *inf)
return; 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" error (_("Task ID %d not known. Use the \"info tasks\" command to\n"
"see the IDs of currently known tasks"), taskno); "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. */ /* Print the Ada task ID. */
printf_filtered (_("Ada Task: %s\n"), 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); parent_taskno = get_task_number_from_id (task_info->parent, inf);
if (parent_taskno) if (parent_taskno)
{ {
struct ada_task_info *parent = struct ada_task_info *parent = &data->task_list[parent_taskno - 1];
VEC_index (ada_task_info_s, data->task_list, parent_taskno - 1);
printf_filtered (_("Parent: %d"), parent_taskno); printf_filtered (_("Parent: %d"), parent_taskno);
if (parent->name[0] != '\0') 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) if (target_taskno)
{ {
struct ada_task_info *target_task_info = ada_task_info *target_task_info = &data->task_list[target_taskno - 1];
VEC_index (ada_task_info_s, data->task_list, target_taskno - 1);
if (target_task_info->name[0] != '\0') if (target_task_info->name[0] != '\0')
printf_filtered (" (%s)", target_task_info->name); 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_task_info *task_info;
struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf); 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" error (_("Task ID %d not known. Use the \"info tasks\" command to\n"
"see the IDs of currently known tasks"), taskno); "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)) if (!ada_task_is_alive (task_info))
error (_("Cannot switch to task %d: Task is no longer running"), taskno); error (_("Cannot switch to task %d: Task is no longer running"), taskno);