From patchwork Mon Aug 20 01:50:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 28966 Received: (qmail 86347 invoked by alias); 20 Aug 2018 01:50:58 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 86229 invoked by uid 89); 20 Aug 2018 01:50:58 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_SOFTFAIL autolearn=ham version=3.3.2 spammy=STATE, separately, 20180807, 2018-08-07 X-HELO: barracuda.ebox.ca Received: from barracuda.ebox.ca (HELO barracuda.ebox.ca) (96.127.255.19) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 20 Aug 2018 01:50:55 +0000 Received: from smtp.ebox.ca (smtp.electronicbox.net [96.127.255.82]) by barracuda.ebox.ca with ESMTP id bRf5JbRlDu4tOV16 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 19 Aug 2018 21:50:53 -0400 (EDT) Received: from simark.lan (unknown [192.222.164.54]) by smtp.ebox.ca (Postfix) with ESMTP id 88E72441D68; Sun, 19 Aug 2018 21:50:53 -0400 (EDT) From: Simon Marchi To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH 2/2] Make ada_tasks_inferior_data::task_list an std::vector Date: Sun, 19 Aug 2018 21:50:51 -0400 Message-Id: <20180820015051.31574-2-simon.marchi@polymtl.ca> In-Reply-To: <20180820015051.31574-1-simon.marchi@polymtl.ca> References: <20180820015051.31574-1-simon.marchi@polymtl.ca> X-IsSubscribed: yes 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: 2018-08-07 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. --- gdb/ada-tasks.c | 84 ++++++++++++++++++------------------------------- 1 file changed, 31 insertions(+), 53 deletions(-) diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c index bd864c2d966c..566eae599ef8 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);