Skip to content

Commit bd13459

Browse files
committed
Fix memory leak
- Free branch_tables for all cached blocks - Free fd_map/mem in rv_delete() - Free all live cache entries in cache_free()
1 parent a24d04a commit bd13459

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

src/cache.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,22 @@ void cache_free(cache_t *cache)
396396
}
397397
}
398398
#endif
399+
/* Free all live cache entries */
400+
cache_entry_t *entry, *safe;
401+
#ifdef __HAVE_TYPEOF
402+
list_for_each_entry_safe (entry, safe, &cache->list, list)
403+
#else
404+
list_for_each_entry_safe (entry, safe, &cache->list, list, cache_entry_t)
405+
#endif
406+
free(entry);
407+
/* Free all ghost (evicted history) cache entries */
408+
#ifdef __HAVE_TYPEOF
409+
list_for_each_entry_safe (entry, safe, &cache->ghost_list, list)
410+
#else
411+
list_for_each_entry_safe (entry, safe, &cache->ghost_list, list,
412+
cache_entry_t)
413+
#endif
414+
free(entry);
399415
free(cache->map.ht_list_head);
400416
free(cache);
401417
}

src/riscv.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,12 +1063,19 @@ void rv_set_fromhost_addr(riscv_t *rv, uint32_t addr)
10631063
}
10641064
#endif
10651065

1066+
#if RV32_HAS(JIT)
1067+
static void free_block_branch_tables(void *block)
1068+
{
1069+
block_t *blk = (block_t *) block;
1070+
for (rv_insn_t *ir = blk->ir_head; ir; ir = ir->next)
1071+
free(ir->branch_table);
1072+
}
1073+
#endif
1074+
10661075
void rv_delete(riscv_t *rv)
10671076
{
10681077
assert(rv);
1069-
#if !RV32_HAS(JIT) || (RV32_HAS(SYSTEM_MMIO))
10701078
vm_attr_t *attr = PRIV(rv);
1071-
#endif
10721079
#if !RV32_HAS(JIT)
10731080
map_delete(attr->fd_map);
10741081
memory_delete(attr->mem);
@@ -1100,10 +1107,13 @@ void rv_delete(riscv_t *rv)
11001107
clear_cache_hot(rv->block_cache, t2c_dispose_block_engine);
11011108
#endif
11021109
jit_state_exit(rv->jit_state);
1110+
clear_cache_hot(rv->block_cache, free_block_branch_tables);
11031111
cache_free(rv->block_cache);
11041112
mpool_destroy(rv->block_ir_mp);
11051113
mpool_destroy(rv->block_mp);
11061114
mpool_destroy(rv->fuse_mp);
1115+
map_delete(attr->fd_map);
1116+
memory_delete(attr->mem);
11071117
#endif
11081118
#if RV32_HAS(SYSTEM_MMIO)
11091119
u8250_delete(attr->uart);

0 commit comments

Comments
 (0)