return value + 1;
}
-static void hash2_remove_value_p(struct hash2_table *hash,
- struct hash2_value **valuep)
+static void
+hash2_remove_value_p(struct hash2_table *hash, struct hash2_value **valuep,
+ bool allow_resize)
{
struct hash2_value *deleted_value;
hash->deleted_values = deleted_value;
hash->count--;
- hash2_resize(hash, FALSE);
+ if (allow_resize)
+ hash2_resize(hash, FALSE);
}
void hash2_remove(struct hash2_table *hash, const void *key)
while (*valuep != NULL) {
if ((*valuep)->key_hash == key_hash &&
hash->key_compare_cb(key, (*valuep) + 1, hash->context)) {
- hash2_remove_value_p(hash, valuep);
+ hash2_remove_value_p(hash, valuep, TRUE);
return;
}
valuep = &(*valuep)->next;
while (*valuep != NULL) {
if (*valuep == iter->value) {
next = (*valuep)->next;
- hash2_remove_value_p(hash, valuep);
+ /* don't allow resizing, otherwise iterating would
+ break completely */
+ hash2_remove_value_p(hash, valuep, FALSE);
iter->next_value = next;
return;
}