aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Vanek <vanekt@fbl.cz>2018-03-22 00:20:15 +0100
committerMatthias Welwarsky <matthias@welwarsky.de>2018-03-30 10:15:23 +0100
commit6eba3777fca4a3e8c0d91dce9caedfeb9c08dc67 (patch)
treea8b46c489c58c2545af44fa8c6695baa27e26419
parent37deb37593c20c05a4bb29e1d88671a1f7ec6548 (diff)
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>
-rw-r--r--src/jtag/core.c8
-rw-r--r--src/openocd.c4
-rw-r--r--src/target/target.c2
3 files changed, 12 insertions, 2 deletions
diff --git a/src/jtag/core.c b/src/jtag/core.c
index 0fbd327f..4522321a 100644
--- a/src/jtag/core.c
+++ b/src/jtag/core.c
@@ -1308,6 +1308,14 @@ void jtag_tap_free(struct jtag_tap *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_mask);
free(tap->expected_ids);
diff --git a/src/openocd.c b/src/openocd.c
index d5d7ebe8..902528d0 100644
--- a/src/openocd.c
+++ b/src/openocd.c
@@ -359,11 +359,11 @@ int openocd_main(int argc, char *argv[])
unregister_all_commands(cmd_ctx, NULL);
+ adapter_quit();
+
/* Shutdown commandline interface */
command_exit(cmd_ctx);
- adapter_quit();
-
free_config();
if (ERROR_FAIL == ret)
diff --git a/src/target/target.c b/src/target/target.c
index 10426023..ac2e1d03 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -1893,6 +1893,8 @@ static void target_destroy(struct target *target)
if (target->type->deinit_target)
target->type->deinit_target(target);
+ jtag_unregister_event_callback(jtag_enable_callback, target);
+
struct target_event_action *teap = target->event_action;
while (teap) {
struct target_event_action *next = teap->next;