@@ -53,19 +53,12 @@ struct EtsHashTable *ets_hashtable_new()
53
53
return htable ;
54
54
}
55
55
56
- static void ets_hashtable_free_node (struct HNode * node , GlobalContext * global )
56
+ void ets_hashtable_free_node (struct HNode * node , GlobalContext * global )
57
57
{
58
58
memory_destroy_heap (& node -> heap , global );
59
59
free (node );
60
60
}
61
61
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
-
69
62
void ets_hashtable_destroy (struct EtsHashTable * hash_table , GlobalContext * global )
70
63
{
71
64
for (size_t i = 0 ; i < hash_table -> capacity ; ++ i ) {
@@ -96,26 +89,30 @@ static void print_info(struct EtsHashTable *hash_table)
96
89
97
90
struct HNode * ets_hashtable_new_node (term entry , int keypos )
98
91
{
99
-
100
92
struct HNode * new_node = malloc (sizeof (struct HNode ));
101
93
if (IS_NULL_PTR (new_node )) {
102
- return NULL ;
94
+ goto cleanup ;
103
95
}
104
96
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 ;
109
100
}
110
101
111
102
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 );
112
105
term key = term_get_tuple_element (new_entry , keypos );
113
106
114
107
new_node -> next = NULL ;
115
108
new_node -> key = key ;
116
109
new_node -> entry = new_entry ;
117
110
118
111
return new_node ;
112
+
113
+ cleanup :
114
+ free (new_node );
115
+ return NULL ;
119
116
}
120
117
121
118
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
145
142
ets_hashtable_free_node (node , global );
146
143
return EtsHashtableOk ;
147
144
} else {
148
- ets_hashtable_free_node (new_node , global );
149
145
return EtsHashtableFailure ;
150
146
}
151
147
}
@@ -193,11 +189,8 @@ bool ets_hashtable_remove(struct EtsHashTable *hash_table, term key, size_t keyp
193
189
while (node ) {
194
190
term key_to_compare = term_get_tuple_element (node -> entry , keypos );
195
191
if (term_compare (key , key_to_compare , TermCompareExact , global ) == TermEquals ) {
196
-
197
- memory_destroy_heap (& node -> heap , global );
198
192
struct HNode * next_node = node -> next ;
199
- free (node );
200
-
193
+ ets_hashtable_free_node (node , global );
201
194
if (prev_node != NULL ) {
202
195
prev_node -> next = next_node ;
203
196
} else {
0 commit comments