Fix tracepoint.c:parse_tracepoint_definition leak (and one more)
[deliverable/binutils-gdb.git] / gdb / ada-tasks.c
index bd864c2d966c613cad52a4354def986f211095bf..e994147a669bf4c6bb15877dbe90ba84303df18d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992-2018 Free Software Foundation, Inc.
+/* Copyright (C) 1992-2019 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -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);
     }
 }
 
@@ -628,6 +611,10 @@ read_atcb (CORE_ADDR task_id, struct ada_task_info *task_info)
   const struct ada_tasks_pspace_data *pspace_data
     = get_ada_tasks_pspace_data (current_program_space);
 
+  /* Clear the whole structure to start with, so that everything
+     is always initialized the same.  */
+  memset (task_info, 0, sizeof (struct ada_task_info));
+
   if (!pspace_data->initialized_p)
     {
       const char *err_msg = ada_get_tcb_types_info ();
@@ -721,14 +708,12 @@ read_atcb (CORE_ADDR task_id, struct ada_task_info *task_info)
     task_info->parent =
       value_as_address (value_field (common_value,
                                     pspace_data->atcb_fieldno.parent));
-  else
-    task_info->parent = 0;
-  
 
-  /* If the ATCB contains some information about entry calls, then
-     compute the "called_task" as well.  Otherwise, zero.  */
+  /* If the task is in an entry call waiting for another task,
+     then determine which task it is.  */
 
-  if (pspace_data->atcb_fieldno.atc_nesting_level > 0
+  if (task_info->state == Entry_Caller_Sleep
+      && pspace_data->atcb_fieldno.atc_nesting_level > 0
       && pspace_data->atcb_fieldno.entry_calls > 0)
     {
       /* Let My_ATCB be the Ada task control block of a task calling the
@@ -749,15 +734,10 @@ read_atcb (CORE_ADDR task_id, struct ada_task_info *task_info)
         value_as_address (value_field (entry_calls_value_element,
                                        called_task_fieldno));
     }
-  else
-    {
-      task_info->called_task = 0;
-    }
 
-  /* If the ATCB cotnains some information about RV callers,
-     then compute the "caller_task".  Otherwise, zero.  */
+  /* If the ATCB cotnains some information about RV callers, then
+     compute the "caller_task".  Otherwise, leave it as zero.  */
 
-  task_info->caller_task = 0;
   if (pspace_data->atcb_fieldno.call >= 0)
     {
       /* Get the ID of the caller task from Common_ATCB.Call.all.Self.
@@ -801,7 +781,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 +954,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 +998,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 +1042,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 +1069,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);
@@ -1150,8 +1127,7 @@ print_ada_task_info (struct ui_out *uiout,
                          _("Accepting RV with %-4d"),
                          get_task_number_from_id (task_info->caller_task,
                                                   inf));
-      else if (task_info->state == Entry_Caller_Sleep
-              && task_info->called_task)
+      else if (task_info->called_task)
        uiout->field_fmt ("state",
                          _("Waiting on RV with %-3d"),
                          get_task_number_from_id (task_info->called_task,
@@ -1186,10 +1162,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 +1190,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')
@@ -1238,7 +1213,7 @@ info_task (struct ui_out *uiout, const char *taskno_str, struct inferior *inf)
         printf_filtered (_("State: Accepting rendezvous with %d"),
                          target_taskno);
       }
-    else if (task_info->state == Entry_Caller_Sleep && task_info->called_task)
+    else if (task_info->called_task)
       {
         target_taskno = get_task_number_from_id (task_info->called_task, inf);
         printf_filtered (_("State: Waiting on task %d's entry"),
@@ -1249,8 +1224,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 +1275,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);
This page took 0.029048 seconds and 4 git commands to generate.