jtag/core, target: unregister JTAG events
Also call adapter_exit() before command_exit() as the latter releases Jim interpreter so JTAG events should be released before. Fixes memory leak reported by valgrind Change-Id: I493f3fcba34ea2b4234148e79a4e329c866e0f05 Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: http://openocd.zylin.com/4474 Tested-by: jenkins Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>riscv-compliance-dev
parent
37deb37593
commit
6eba3777fc
|
@ -1308,6 +1308,14 @@ void jtag_tap_free(struct jtag_tap *tap)
|
||||||
{
|
{
|
||||||
jtag_unregister_event_callback(&jtag_reset_callback, tap);
|
jtag_unregister_event_callback(&jtag_reset_callback, tap);
|
||||||
|
|
||||||
|
struct jtag_tap_event_action *jteap = tap->event_action;
|
||||||
|
while (jteap) {
|
||||||
|
struct jtag_tap_event_action *next = jteap->next;
|
||||||
|
Jim_DecrRefCount(jteap->interp, jteap->body);
|
||||||
|
free(jteap);
|
||||||
|
jteap = next;
|
||||||
|
}
|
||||||
|
|
||||||
free(tap->expected);
|
free(tap->expected);
|
||||||
free(tap->expected_mask);
|
free(tap->expected_mask);
|
||||||
free(tap->expected_ids);
|
free(tap->expected_ids);
|
||||||
|
|
|
@ -359,11 +359,11 @@ int openocd_main(int argc, char *argv[])
|
||||||
|
|
||||||
unregister_all_commands(cmd_ctx, NULL);
|
unregister_all_commands(cmd_ctx, NULL);
|
||||||
|
|
||||||
|
adapter_quit();
|
||||||
|
|
||||||
/* Shutdown commandline interface */
|
/* Shutdown commandline interface */
|
||||||
command_exit(cmd_ctx);
|
command_exit(cmd_ctx);
|
||||||
|
|
||||||
adapter_quit();
|
|
||||||
|
|
||||||
free_config();
|
free_config();
|
||||||
|
|
||||||
if (ERROR_FAIL == ret)
|
if (ERROR_FAIL == ret)
|
||||||
|
|
|
@ -1893,6 +1893,8 @@ static void target_destroy(struct target *target)
|
||||||
if (target->type->deinit_target)
|
if (target->type->deinit_target)
|
||||||
target->type->deinit_target(target);
|
target->type->deinit_target(target);
|
||||||
|
|
||||||
|
jtag_unregister_event_callback(jtag_enable_callback, target);
|
||||||
|
|
||||||
struct target_event_action *teap = target->event_action;
|
struct target_event_action *teap = target->event_action;
|
||||||
while (teap) {
|
while (teap) {
|
||||||
struct target_event_action *next = teap->next;
|
struct target_event_action *next = teap->next;
|
||||||
|
|
Loading…
Reference in New Issue