From: Philippe Waroquiers Date: Sun, 17 Feb 2019 16:58:17 +0000 (+0100) Subject: Fix leaks of 'per program space' and 'per inferior' ada task data. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=040b3e95e41f7af82e95c781aadc56a16019fd68;p=binutils-gdb.git Fix leaks of 'per program space' and 'per inferior' ada task data. Valgrind reports leaks such as the below. Fix these leaks by changing ada_tasks_pspace_data_handle and ada_tasks_inferior_data_handle to use the 'with_cleanup' register variant. Tested on debian/amd64 natively and under Valgrind. ==26346== 56 bytes in 1 blocks are definitely lost in loss record 631 of 3,249 ==26346== at 0x4C2C4CC: operator new(unsigned long) (vg_replace_malloc.c:344) ==26346== by 0x38F911: get_ada_tasks_inferior_data(inferior*) (ada-tasks.c:281) ==26346== by 0x38FA3F: ada_tasks_invalidate_inferior_data (ada-tasks.c:1362) ==26346== by 0x38FA3F: ada_tasks_new_objfile_observer(objfile*) (ada-tasks.c:1411) ==26346== by 0x60CBC5: operator() (functional:2127) ==26346== by 0x60CBC5: notify (observable.h:106) ==26346== by 0x60CBC5: clear_symtab_users(enum_flags) (symfile.c:2903) ... ==26346== 104 bytes in 1 blocks are definitely lost in loss record 984 of 3,249 ==26346== at 0x4C2E0BC: calloc (vg_replace_malloc.c:762) ==26346== by 0x4056F0: xcalloc (common-utils.c:84) ==26346== by 0x38F8AE: xcnew (poison.h:122) ==26346== by 0x38F8AE: get_ada_tasks_pspace_data(program_space*) (ada-tasks.c:253) ==26346== by 0x38FA77: ada_tasks_invalidate_pspace_data (ada-tasks.c:1354) ==26346== by 0x38FA77: ada_tasks_new_objfile_observer(objfile*) (ada-tasks.c:1394) ==26346== by 0x60CBC5: operator() (functional:2127) ==26346== by 0x60CBC5: notify (observable.h:106) ... gdb/ChangeLog 2019-02-18 Philippe Waroquiers * ada-task.c (_initialize_tasks): Use 'with_cleanup' register variant for ada_tasks_pspace_data_handle and ada_tasks_inferior_data_handle. (ada_tasks_pspace_data_cleanup): New function. (ada_tasks_inferior_data_cleanup): New function. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ac29a3279ee..65d65487339 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2019-02-18 Philippe Waroquiers + + * ada-task.c (_initialize_tasks): Use 'with_cleanup' register + variant for ada_tasks_pspace_data_handle and + ada_tasks_inferior_data_handle. + (ada_tasks_pspace_data_cleanup): New function. + (ada_tasks_inferior_data_cleanup): New function. + 2019-02-17 Tom Tromey * macrotab.h (macro_source_fullname): Return a std::string. diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c index e994147a669..440e32bf483 100644 --- a/gdb/ada-tasks.c +++ b/gdb/ada-tasks.c @@ -161,6 +161,15 @@ struct ada_tasks_pspace_data /* 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); +} + /* The kind of data structure used by the runtime to store the list of Ada tasks. */ @@ -285,6 +294,15 @@ get_ada_tasks_inferior_data (struct inferior *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. */ @@ -1414,8 +1432,12 @@ ada_tasks_new_objfile_observer (struct objfile *objfile) void _initialize_tasks (void) { - ada_tasks_pspace_data_handle = register_program_space_data (); - ada_tasks_inferior_data_handle = register_inferior_data (); + 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);