* [PATCH 1/2] Make ada-lang.c::add_angle_brackets return an std::string
@ 2018-08-20 1:50 Simon Marchi
2018-08-20 1:50 ` [PATCH 2/2] Make ada_tasks_inferior_data::task_list an std::vector Simon Marchi
2018-08-26 16:43 ` [PATCH 1/2] Make ada-lang.c::add_angle_brackets return an std::string Simon Marchi
0 siblings, 2 replies; 3+ messages in thread
From: Simon Marchi @ 2018-08-20 1:50 UTC (permalink / raw)
To: gdb-patches; +Cc: Simon Marchi
This removes the need for manual memory management. It may also be a
bit more efficient, since the returned string can be moved all the way
into the destination, in ada_lookup_name_info::matches.
gdb/ChangeLog:
* ada-lang.c (add_angle_brackets): Return std::string.
---
gdb/ada-lang.c | 11 +++--------
1 file changed, 3 insertions(+), 8 deletions(-)
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index db5334dd1e00..d9d3087642bc 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -541,17 +541,12 @@ ada_unqualified_name (const char *decoded_name)
return result;
}
-/* Return a string starting with '<', followed by STR, and '>'.
- The result is good until the next call. */
+/* Return a string starting with '<', followed by STR, and '>'. */
-static char *
+static std::string
add_angle_brackets (const char *str)
{
- static char *result = NULL;
-
- xfree (result);
- result = xstrprintf ("<%s>", str);
- return result;
+ return string_printf ("<%s>", str);
}
static const char *
--
2.18.0
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 2/2] Make ada_tasks_inferior_data::task_list an std::vector
2018-08-20 1:50 [PATCH 1/2] Make ada-lang.c::add_angle_brackets return an std::string Simon Marchi
@ 2018-08-20 1:50 ` Simon Marchi
2018-08-26 16:43 ` [PATCH 1/2] Make ada-lang.c::add_angle_brackets return an std::string Simon Marchi
1 sibling, 0 replies; 3+ messages in thread
From: Simon Marchi @ 2018-08-20 1:50 UTC (permalink / raw)
To: gdb-patches; +Cc: Simon Marchi
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 <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.
---
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<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);
--
2.18.0
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 1/2] Make ada-lang.c::add_angle_brackets return an std::string
2018-08-20 1:50 [PATCH 1/2] Make ada-lang.c::add_angle_brackets return an std::string Simon Marchi
2018-08-20 1:50 ` [PATCH 2/2] Make ada_tasks_inferior_data::task_list an std::vector Simon Marchi
@ 2018-08-26 16:43 ` Simon Marchi
1 sibling, 0 replies; 3+ messages in thread
From: Simon Marchi @ 2018-08-26 16:43 UTC (permalink / raw)
To: gdb-patches
On 2018-08-19 9:50 p.m., Simon Marchi wrote:
> This removes the need for manual memory management. It may also be a
> bit more efficient, since the returned string can be moved all the way
> into the destination, in ada_lookup_name_info::matches.
>
> gdb/ChangeLog:
>
> * ada-lang.c (add_angle_brackets): Return std::string.
> ---
> gdb/ada-lang.c | 11 +++--------
> 1 file changed, 3 insertions(+), 8 deletions(-)
>
> diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
> index db5334dd1e00..d9d3087642bc 100644
> --- a/gdb/ada-lang.c
> +++ b/gdb/ada-lang.c
> @@ -541,17 +541,12 @@ ada_unqualified_name (const char *decoded_name)
> return result;
> }
>
> -/* Return a string starting with '<', followed by STR, and '>'.
> - The result is good until the next call. */
> +/* Return a string starting with '<', followed by STR, and '>'. */
>
> -static char *
> +static std::string
> add_angle_brackets (const char *str)
> {
> - static char *result = NULL;
> -
> - xfree (result);
> - result = xstrprintf ("<%s>", str);
> - return result;
> + return string_printf ("<%s>", str);
> }
>
> static const char *
>
I pushed these two patches.
Simon
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2018-08-26 16:43 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-08-20 1:50 [PATCH 1/2] Make ada-lang.c::add_angle_brackets return an std::string Simon Marchi
2018-08-20 1:50 ` [PATCH 2/2] Make ada_tasks_inferior_data::task_list an std::vector Simon Marchi
2018-08-26 16:43 ` [PATCH 1/2] Make ada-lang.c::add_angle_brackets return an std::string Simon Marchi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).