diff options
author | Philippe Waroquiers <philippe.waroquiers@skynet.be> | 2019-02-17 17:58:17 +0100 |
---|---|---|
committer | Philippe Waroquiers <philippe.waroquiers@skynet.be> | 2019-02-18 22:14:59 +0100 |
commit | 040b3e95e41f7af82e95c781aadc56a16019fd68 (patch) | |
tree | ee4afeb18e8eb33018fd7837347b08caca60e67b /gdb | |
parent | a31b8bd9a054b494fd6ab18f14d84a2f0690f8a1 (diff) | |
download | gdb-040b3e95e41f7af82e95c781aadc56a16019fd68.zip gdb-040b3e95e41f7af82e95c781aadc56a16019fd68.tar.gz gdb-040b3e95e41f7af82e95c781aadc56a16019fd68.tar.bz2 |
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_add_flag>) (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<ada_tasks_pspace_data> (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 <philippe.waroquiers@skynet.be>
* 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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/ada-tasks.c | 26 |
2 files changed, 32 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ac29a32..65d6548 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2019-02-18 Philippe Waroquiers <philippe.waroquiers@skynet.be> + + * 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 <tom@tromey.com> * macrotab.h (macro_source_fullname): Return a std::string. diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c index e994147..440e32b 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); |