diff options
author | Simon Marchi <simon.marchi@polymtl.ca> | 2018-08-26 11:56:41 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2018-08-26 11:56:57 -0400 |
commit | c645cda49e2b5fcf35773089d1ae16d6fc3481c6 (patch) | |
tree | 83699fb7f1d014edabca1042f933e5e7430b7318 /gdb/ada-tasks.c | |
parent | 39e7af3e4b4e6c9f39d8d58cae73a2d307e6e1a1 (diff) | |
download | gdb-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.c | 84 |
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); |