memleak: refactor unicorn_common.h, move stuff to uc_close
This commit is contained in:
49
uc.c
49
uc.c
@@ -29,7 +29,16 @@
|
||||
#include "qemu/target-sparc/unicorn.h"
|
||||
|
||||
#include "qemu/include/hw/boards.h"
|
||||
#include "qemu/include/qemu/queue.h"
|
||||
|
||||
static void free_table(gpointer key, gpointer value, gpointer data)
|
||||
{
|
||||
TypeInfo *ti = (TypeInfo*) value;
|
||||
g_free((void*) ti->class);
|
||||
g_free((void*) ti->name);
|
||||
g_free((void*) ti->parent);
|
||||
g_free((void*) ti);
|
||||
}
|
||||
|
||||
UNICORN_EXPORT
|
||||
unsigned int uc_version(unsigned int *major, unsigned int *minor)
|
||||
@@ -283,19 +292,53 @@ uc_err uc_close(uc_engine *uc)
|
||||
int i;
|
||||
struct list_item *cur;
|
||||
struct hook *hook;
|
||||
CPUState *cpu;
|
||||
|
||||
// Cleanup internally.
|
||||
if (uc->release)
|
||||
uc->release(uc->tcg_ctx);
|
||||
g_free(uc->tcg_ctx);
|
||||
|
||||
// Cleanup CPU.
|
||||
CPU_FOREACH(cpu) {
|
||||
g_free(cpu->tcg_as_listener);
|
||||
g_free(cpu->thread);
|
||||
g_free(cpu->halt_cond);
|
||||
}
|
||||
|
||||
// Cleanup all objects.
|
||||
OBJECT(uc->machine_state->accelerator)->ref = 1;
|
||||
OBJECT(uc->machine_state)->ref = 1;
|
||||
OBJECT(uc->owner)->ref = 1;
|
||||
OBJECT(uc->root)->ref = 1;
|
||||
|
||||
object_unref(uc, OBJECT(uc->machine_state->accelerator));
|
||||
object_unref(uc, OBJECT(uc->machine_state));
|
||||
object_unref(uc, uc->cpu);
|
||||
object_unref(uc, OBJECT(&uc->io_mem_notdirty));
|
||||
object_unref(uc, OBJECT(&uc->io_mem_unassigned));
|
||||
object_unref(uc, OBJECT(&uc->io_mem_rom));
|
||||
object_unref(uc, OBJECT(uc->root));
|
||||
|
||||
// System memory.
|
||||
g_free(uc->system_memory);
|
||||
|
||||
// Thread relateds.
|
||||
if (uc->qemu_thread_data)
|
||||
free(uc->qemu_thread_data);
|
||||
|
||||
qemu_mutex_destroy(&uc->qemu_global_mutex);
|
||||
qemu_cond_destroy(&uc->qemu_cpu_cond);
|
||||
|
||||
// Other auxilaries.
|
||||
free(uc->l1_map);
|
||||
|
||||
if (uc->bounce.buffer) {
|
||||
free(uc->bounce.buffer);
|
||||
}
|
||||
|
||||
g_free(uc->tcg_ctx);
|
||||
|
||||
g_hash_table_destroy(uc->type_table);
|
||||
g_hash_table_foreach(uc->type_table, free_table, uc);
|
||||
g_hash_table_unref(uc->type_table);
|
||||
|
||||
for (i = 0; i < DIRTY_MEMORY_NUM; i++) {
|
||||
free(uc->ram_list.dirty_memory[i]);
|
||||
|
||||
Reference in New Issue
Block a user