Skip to content

Commit fefeb00

Browse files
committed
ets: use ets_hashtable_free_node directly
Signed-off-by: Jakub Gonet <jakub.gonet@swmansion.com>
1 parent f911fba commit fefeb00

File tree

3 files changed

+16
-21
lines changed

3 files changed

+16
-21
lines changed

src/libAtomVM/ets.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,9 @@ static EtsErrorCode ets_table_insert_list(struct EtsTable *ets_table, term list,
293293
term tuple = term_get_list_head(list);
294294
nodes[i] = ets_hashtable_new_node(tuple, ets_table->keypos);
295295
if (IS_NULL_PTR(nodes[i])) {
296-
ets_hashtable_free_node_array(nodes, i, ctx->global);
296+
for (size_t it = 0; it < i; ++it) {
297+
ets_hashtable_free_node(nodes[it], ctx->global);
298+
}
297299
free(nodes);
298300
return EtsAllocationFailure;
299301
}

src/libAtomVM/ets_hashtable.c

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,12 @@ struct EtsHashTable *ets_hashtable_new()
5353
return htable;
5454
}
5555

56-
static void ets_hashtable_free_node(struct HNode *node, GlobalContext *global)
56+
void ets_hashtable_free_node(struct HNode *node, GlobalContext *global)
5757
{
5858
memory_destroy_heap(&node->heap, global);
5959
free(node);
6060
}
6161

62-
void ets_hashtable_free_node_array(struct HNode **allocated, size_t size, GlobalContext *global)
63-
{
64-
for (size_t i = 0; i < size; ++i) {
65-
ets_hashtable_free_node(allocated[i], global);
66-
}
67-
}
68-
6962
void ets_hashtable_destroy(struct EtsHashTable *hash_table, GlobalContext *global)
7063
{
7164
for (size_t i = 0; i < hash_table->capacity; ++i) {
@@ -96,26 +89,30 @@ static void print_info(struct EtsHashTable *hash_table)
9689

9790
struct HNode *ets_hashtable_new_node(term entry, int keypos)
9891
{
99-
10092
struct HNode *new_node = malloc(sizeof(struct HNode));
10193
if (IS_NULL_PTR(new_node)) {
102-
return NULL;
94+
goto cleanup;
10395
}
10496

105-
size_t size = (size_t) memory_estimate_usage(entry);
106-
if (memory_init_heap(&new_node->heap, size) != MEMORY_GC_OK) {
107-
free(new_node);
108-
return NULL;
97+
size_t size = memory_estimate_usage(entry);
98+
if (UNLIKELY(memory_init_heap(&new_node->heap, size) != MEMORY_GC_OK)) {
99+
goto cleanup;
109100
}
110101

111102
term new_entry = memory_copy_term_tree(&new_node->heap, entry);
103+
TERM_DEBUG_ASSERT(term_is_tuple(new_entry));
104+
TERM_DEBUG_ASSERT(term_get_tuple_arity(new_entry) >= keypos);
112105
term key = term_get_tuple_element(new_entry, keypos);
113106

114107
new_node->next = NULL;
115108
new_node->key = key;
116109
new_node->entry = new_entry;
117110

118111
return new_node;
112+
113+
cleanup:
114+
free(new_node);
115+
return NULL;
119116
}
120117

121118
EtsHashtableErrorCode ets_hashtable_insert(struct EtsHashTable *hash_table, struct HNode *new_node, EtsHashtableOptions opts, GlobalContext *global)
@@ -145,7 +142,6 @@ EtsHashtableErrorCode ets_hashtable_insert(struct EtsHashTable *hash_table, stru
145142
ets_hashtable_free_node(node, global);
146143
return EtsHashtableOk;
147144
} else {
148-
ets_hashtable_free_node(new_node, global);
149145
return EtsHashtableFailure;
150146
}
151147
}
@@ -193,11 +189,8 @@ bool ets_hashtable_remove(struct EtsHashTable *hash_table, term key, size_t keyp
193189
while (node) {
194190
term key_to_compare = term_get_tuple_element(node->entry, keypos);
195191
if (term_compare(key, key_to_compare, TermCompareExact, global) == TermEquals) {
196-
197-
memory_destroy_heap(&node->heap, global);
198192
struct HNode *next_node = node->next;
199-
free(node);
200-
193+
ets_hashtable_free_node(node, global);
201194
if (prev_node != NULL) {
202195
prev_node->next = next_node;
203196
} else {

src/libAtomVM/ets_hashtable.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ EtsHashtableErrorCode ets_hashtable_insert(struct EtsHashTable *hash_table, stru
5656
term ets_hashtable_lookup(struct EtsHashTable *hash_table, term key, size_t keypos, GlobalContext *global);
5757
bool ets_hashtable_remove(struct EtsHashTable *hash_table, term key, size_t keypos, GlobalContext *global);
5858
struct HNode *ets_hashtable_new_node(term entry, int keypos);
59-
void ets_hashtable_free_node_array(struct HNode **allocated, size_t len, GlobalContext *global);
59+
void ets_hashtable_free_node(struct HNode *node, GlobalContext *global);
6060

6161
#ifdef __cplusplus
6262
}

0 commit comments

Comments
 (0)