From c645cda49e2b5fcf35773089d1ae16d6fc3481c6 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Sun, 26 Aug 2018 11:56:41 -0400 Subject: [PATCH] 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. : 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. --- gdb/ChangeLog | 19 +++++++++++ gdb/ada-tasks.c | 84 ++++++++++++++++++------------------------------- 2 files changed, 50 insertions(+), 53 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index eae5c2f6c01..a9819ab8cdf 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,22 @@ +2018-08-26 Simon Marchi + + * ada-tasks.c (ada_task_info_s): Remove typedef. + (DEF_VEC_O(ada_task_info_s)): Remove. + (struct ada_tasks_inferior_data): Initialize fields. + : 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 * ada-lang.c (add_angle_brackets): Return std::string. diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c index bd864c2d966..566eae599ef 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 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); -- 2.30.2