aboutsummaryrefslogtreecommitdiff
path: root/gdb/ada-tasks.c
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@polymtl.ca>2018-08-26 11:56:41 -0400
committerSimon Marchi <simon.marchi@polymtl.ca>2018-08-26 11:56:57 -0400
commitc645cda49e2b5fcf35773089d1ae16d6fc3481c6 (patch)
tree83699fb7f1d014edabca1042f933e5e7430b7318 /gdb/ada-tasks.c
parent39e7af3e4b4e6c9f39d8d58cae73a2d307e6e1a1 (diff)
downloadgdb-c645cda49e2b5fcf35773089d1ae16d6fc3481c6.zip
gdb-c645cda49e2b5fcf35773089d1ae16d6fc3481c6.tar.gz
gdb-c645cda49e2b5fcf35773089d1ae16d6fc3481c6.tar.bz2
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.
Diffstat (limited to 'gdb/ada-tasks.c')
-rw-r--r--gdb/ada-tasks.c84
1 files changed, 31 insertions, 53 deletions
diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c
index bd864c2..566eae5 100644
--- a/gdb/ada-tasks.c
+++ b/gdb/ada-tasks.c
@@ -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);