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);
+}
--- a/src/atom.h	Tue Sep 03 12:14:59 2019 +0200
+++ b/src/atom.h	Tue Sep 03 12:15:21 2019 +0200
@@ -25,6 +25,8 @@
  */
 const char* yatom_name(yatom_t atom);
 
+void yatom_free_all(void);
+
 /**
  * @}
  */
--- a/src/atom_test.c	Tue Sep 03 12:14:59 2019 +0200
+++ b/src/atom_test.c	Tue Sep 03 12:15:21 2019 +0200
@@ -23,5 +23,6 @@
 int main(void) {
     test_atom_table();
     test_atom_name();
+    yatom_free_all();
     return 0;
 }