#include "progspace.h"
#include "objfiles.h"
+static int ada_build_task_list ();
+
/* The name of the array in the GNAT runtime where the Ada Task Control
Block of each task is stored. */
#define KNOWN_TASKS_NAME "system__tasking__debug__known_tasks"
/* Nonzero if the data has been initialized. If set to zero,
it means that the data has either not been initialized, or
has potentially become stale. */
- int initialized_p;
+ int initialized_p = 0;
/* The ATCB record type. */
- struct type *atcb_type;
+ struct type *atcb_type = nullptr;
/* The ATCB "Common" component type. */
- struct type *atcb_common_type;
+ struct type *atcb_common_type = nullptr;
/* The type of the "ll" field, from the atcb_common_type. */
- struct type *atcb_ll_type;
+ struct type *atcb_ll_type = nullptr;
/* The type of the "call" field, from the atcb_common_type. */
- struct type *atcb_call_type;
+ struct type *atcb_call_type = nullptr;
/* The index of various fields in the ATCB record and sub-records. */
- struct atcb_fieldnos atcb_fieldno;
+ struct atcb_fieldnos atcb_fieldno {};
};
/* Key to our per-program-space data. */
-static const struct program_space_data *ada_tasks_pspace_data_handle;
-
-/* A cleanup routine for our per-program-space data. */
-static void
-ada_tasks_pspace_data_cleanup (struct program_space *pspace, void *arg)
-{
- struct ada_tasks_pspace_data *data
- = (struct ada_tasks_pspace_data *) arg;
- xfree (data);
-}
+static const struct program_space_key<ada_tasks_pspace_data>
+ ada_tasks_pspace_data_handle;
/* The kind of data structure used by the runtime to store the list
of Ada tasks. */
/* 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 = 0;
+ bool task_list_valid_p = false;
/* The list of Ada tasks.
};
/* Key to our per-inferior data. */
-static const struct inferior_data *ada_tasks_inferior_data_handle;
+static const struct inferior_key<ada_tasks_inferior_data>
+ ada_tasks_inferior_data_handle;
/* Return the ada-tasks module's data for the given program space (PSPACE).
If none is found, add a zero'ed one now.
{
struct ada_tasks_pspace_data *data;
- data = ((struct ada_tasks_pspace_data *)
- program_space_data (pspace, ada_tasks_pspace_data_handle));
+ data = ada_tasks_pspace_data_handle.get (pspace);
if (data == NULL)
- {
- data = XCNEW (struct ada_tasks_pspace_data);
- set_program_space_data (pspace, ada_tasks_pspace_data_handle, data);
- }
+ data = ada_tasks_pspace_data_handle.emplace (pspace);
return data;
}
{
struct ada_tasks_inferior_data *data;
- data = ((struct ada_tasks_inferior_data *)
- inferior_data (inf, ada_tasks_inferior_data_handle));
+ data = ada_tasks_inferior_data_handle.get (inf);
if (data == NULL)
- {
- data = new ada_tasks_inferior_data;
- set_inferior_data (inf, ada_tasks_inferior_data_handle, data);
- }
+ data = ada_tasks_inferior_data_handle.emplace (inf);
return data;
}
-/* A cleanup routine for our per-inferior data. */
-static void
-ada_tasks_inferior_data_cleanup (struct inferior *inf, void *arg)
-{
- struct ada_tasks_inferior_data *data
- = (struct ada_tasks_inferior_data *) arg;
- delete data;
-}
-
/* Return the task number of the task whose thread is THREAD, or zero
if the task could not be found. */
}
/* Read the Known_Tasks array from the inferior memory, and store
- it in the current inferior's TASK_LIST. Return non-zero upon success. */
+ it in the current inferior's TASK_LIST. Return true upon success. */
-static int
+static bool
read_known_tasks_array (struct ada_tasks_inferior_data *data)
{
const int target_ptr_byte = TYPE_LENGTH (data->known_tasks_element);
add_ada_task (task_id, current_inferior ());
}
- return 1;
+ return true;
}
/* Read the known tasks from the inferior memory, and store it in
- the current inferior's TASK_LIST. Return non-zero upon success. */
+ the current inferior's TASK_LIST. Return true upon success. */
-static int
+static bool
read_known_tasks_list (struct ada_tasks_inferior_data *data)
{
const int target_ptr_byte = TYPE_LENGTH (data->known_tasks_element);
/* Sanity check. */
if (pspace_data->atcb_fieldno.activation_link < 0)
- return 0;
+ return false;
/* Build a new list by reading the ATCBs. Read head of the list. */
read_memory (data->known_tasks_addr, known_tasks, target_ptr_byte);
pspace_data->atcb_fieldno.activation_link));
}
- return 1;
+ return true;
}
/* Set all fields of the current inferior ada-tasks data pointed by DATA.
}
/* Read the known tasks from the current inferior's memory, and store it
- in the current inferior's data TASK_LIST.
- Return non-zero upon success. */
+ in the current inferior's data TASK_LIST. */
-static int
-read_known_tasks (void)
+static void
+read_known_tasks ()
{
struct ada_tasks_inferior_data *data =
get_ada_tasks_inferior_data (current_inferior ());
ada_tasks_inferior_data_sniffer (data);
gdb_assert (data->known_tasks_kind != ADA_TASKS_UNKNOWN);
+ /* Step 3: Set task_list_valid_p, to avoid re-reading the Known_Tasks
+ array unless needed. */
switch (data->known_tasks_kind)
{
- case ADA_TASKS_NOT_FOUND: /* Tasking not in use in inferior. */
- return 0;
- case ADA_TASKS_ARRAY:
- return read_known_tasks_array (data);
- case ADA_TASKS_LIST:
- return read_known_tasks_list (data);
+ case ADA_TASKS_NOT_FOUND: /* Tasking not in use in inferior. */
+ break;
+ case ADA_TASKS_ARRAY:
+ data->task_list_valid_p = read_known_tasks_array (data);
+ break;
+ case ADA_TASKS_LIST:
+ data->task_list_valid_p = read_known_tasks_list (data);
+ break;
}
-
- /* Step 3: Set task_list_valid_p, to avoid re-reading the Known_Tasks
- array unless needed. Then report a success. */
- data->task_list_valid_p = 1;
-
- return 1;
}
/* Build the task_list by reading the Known_Tasks array from
the inferior, and return the number of tasks in that list
(zero means that the program is not using tasking at all). */
-int
-ada_build_task_list (void)
+static int
+ada_build_task_list ()
{
struct ada_tasks_inferior_data *data;
void
print_ada_task_info (struct ui_out *uiout,
- char *arg_str,
+ const char *arg_str,
struct inferior *inf)
{
struct ada_tasks_inferior_data *data;
{
struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
- data->task_list_valid_p = 0;
+ data->task_list_valid_p = false;
}
/* Invalidate the per-program-space data. */
struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
data->known_tasks_kind = ADA_TASKS_UNKNOWN;
- data->task_list_valid_p = 0;
+ data->task_list_valid_p = false;
}
/* The 'normal_stop' observer notification callback. */
void
_initialize_tasks (void)
{
- ada_tasks_pspace_data_handle
- = register_program_space_data_with_cleanup (NULL,
- ada_tasks_pspace_data_cleanup);
- ada_tasks_inferior_data_handle
- = register_inferior_data_with_cleanup (NULL,
- ada_tasks_inferior_data_cleanup);
-
/* Attach various observers. */
gdb::observers::normal_stop.attach (ada_tasks_normal_stop_observer);
gdb::observers::new_objfile.attach (ada_tasks_new_objfile_observer);