Mercurial > lbo > hg > ylisp
changeset 145:7887550c61c6
atom: Allow freeing atoms table
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Tue, 03 Sep 2019 12:15:21 +0200 |
parents | 105037679bf8 |
children | aa551e42de49 |
files | src/atom.c src/atom.h src/atom_test.c |
diffstat | 3 files changed, 16 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/atom.c Tue Sep 03 12:14:59 2019 +0200 +++ b/src/atom.c Tue Sep 03 12:15:21 2019 +0200 @@ -16,7 +16,7 @@ static bool yatom_table_initialized = false; // Table from atom name to atom id. This is not in the hot path of important functions! static struct hsearch_data yatom_table; -static yvec_t yatom_ids; // Vector of const char*. +static yvec_t yatom_names; // Vector of char*. static yatom_t yatom_counter = YATOM_COUNTER_OFFSET; // Make atom IDs recognizable. @@ -24,7 +24,7 @@ if (yatom_table_initialized) return; yatom_table_initialized = true; hcreate_r(YATOM_MAX_NUM_ATOMS, &yatom_table); - yvec_init(&yatom_ids, sizeof(const char*), YATOM_MAX_NUM_ATOMS); + yvec_init(&yatom_names, sizeof(const char*), YATOM_MAX_NUM_ATOMS); } yatom_t yatom_get_or_add(const char* name) { @@ -35,8 +35,8 @@ // Not found -- insert. wanted.key = strdup(name); wanted.data = (void*)yatom_counter++; - YVEC_PUSH(&yatom_ids, &wanted.key); - assert(yatom_ids.len == yatom_counter - YATOM_COUNTER_OFFSET); + YVEC_PUSH(&yatom_names, &wanted.key); + assert(yatom_names.len == yatom_counter - YATOM_COUNTER_OFFSET); assert(hsearch_r(wanted, ENTER, &found, &yatom_table)); return (yatom_t)wanted.data; } else { @@ -47,5 +47,13 @@ const char* yatom_name(yatom_t atom) { yatom_init_table(); - return *YVEC_AT(&yatom_ids, atom - YATOM_COUNTER_OFFSET, yconstchar*); + return *YVEC_AT(&yatom_names, atom - YATOM_COUNTER_OFFSET, yconstchar*); } + +void yatom_free_all(void) { + for (size_t i = 0; i < yatom_counter-YATOM_COUNTER_OFFSET; i++) { + free(*YVEC_AT(&yatom_names, i, char*)); + } + yvec_destroy(&yatom_names); + hdestroy_r(&yatom_table); +}