diff options
author | Marc Schink <openocd-dev@marcschink.de> | 2019-04-01 13:47:17 +0200 |
---|---|---|
committer | Tomas Vanek <vanekt@fbl.cz> | 2019-04-10 16:37:21 +0100 |
commit | d5936dc688bedf54848a29b7c171ef47deb2bf91 (patch) | |
tree | fba2727f9d1c98d7d757fdd59b1ee32e6b489ef1 /src | |
parent | 6aae614cc2072e0d45bc32213595286ccbd32248 (diff) | |
download | riscv-openocd-d5936dc688bedf54848a29b7c171ef47deb2bf91.zip riscv-openocd-d5936dc688bedf54848a29b7c171ef47deb2bf91.tar.gz riscv-openocd-d5936dc688bedf54848a29b7c171ef47deb2bf91.tar.bz2 |
target/riscv: Free registers to avoid memory leak
Tested with SiFive HiFive1 development board.
Change-Id: I96a9a528057fcf9fc54d3da46a672d2cd54c3d5f
Signed-off-by: Marc Schink <openocd-dev@marcschink.de>
Reviewed-on: http://openocd.zylin.com/4885
Tested-by: jenkins
Reviewed-by: Tim Newsome <tim@sifive.com>
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
Diffstat (limited to 'src')
-rw-r--r-- | src/target/riscv/riscv.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/src/target/riscv/riscv.c b/src/target/riscv/riscv.c index 3b88e33..44da5a9 100644 --- a/src/target/riscv/riscv.c +++ b/src/target/riscv/riscv.c @@ -271,16 +271,8 @@ static int riscv_init_target(struct command_context *cmd_ctx, return ERROR_OK; } -static void riscv_deinit_target(struct target *target) +static void riscv_free_registers(struct target *target) { - LOG_DEBUG("riscv_deinit_target()"); - struct target_type *tt = get_target_type(target); - if (tt) { - tt->deinit_target(target); - riscv_info_t *info = (riscv_info_t *) target->arch_info; - free(info->reg_names); - free(info); - } /* Free the shared structure use for most registers. */ if (target->reg_cache) { if (target->reg_cache->reg_list) { @@ -293,6 +285,21 @@ static void riscv_deinit_target(struct target *target) } free(target->reg_cache); } +} + +static void riscv_deinit_target(struct target *target) +{ + LOG_DEBUG("riscv_deinit_target()"); + struct target_type *tt = get_target_type(target); + if (tt) { + tt->deinit_target(target); + riscv_info_t *info = (riscv_info_t *) target->arch_info; + free(info->reg_names); + free(info); + } + + riscv_free_registers(target); + target->arch_info = NULL; } @@ -2503,11 +2510,7 @@ int riscv_init_registers(struct target *target) { RISCV_INFO(info); - if (target->reg_cache) { - if (target->reg_cache->reg_list) - free(target->reg_cache->reg_list); - free(target->reg_cache); - } + riscv_free_registers(target); target->reg_cache = calloc(1, sizeof(*target->reg_cache)); target->reg_cache->name = "RISC-V Registers"; |