diff --git a/lib/isc/hashmap.c b/lib/isc/hashmap.c index a8e635a969..1fa5460770 100644 --- a/lib/isc/hashmap.c +++ b/lib/isc/hashmap.c @@ -87,6 +87,7 @@ struct isc_hashmap { isc_mem_t *mctx; size_t count; hashmap_table_t tables[HASHMAP_NUM_TABLES]; + uint_fast32_t iterators; }; struct isc_hashmap_iter { @@ -350,6 +351,9 @@ hashmap_rehash_one(isc_hashmap_t *hashmap) { hashmap_node_t *oldtable = hashmap->tables[oldidx].table; hashmap_node_t node; + /* Don't rehash when iterating */ + INSIST(hashmap->iterators == 0); + /* Find first non-empty node */ while (hashmap->hiter < oldsize && oldtable[hashmap->hiter].key == NULL) { @@ -502,6 +506,8 @@ hashmap_add(isc_hashmap_t *hashmap, const uint32_t hashval, hashmap_node_t *current = NULL; uint32_t pos; + INSIST(hashmap->iterators == 0); + hash = isc_hash_bits32(hashval, hashmap->tables[idx].hashbits); /* Initialize the node to be store to 'node' */ @@ -599,6 +605,8 @@ isc_hashmap_iter_create(isc_hashmap_t *hashmap, isc_hashmap_iter_t **iterp) { .hindex = hashmap->hindex, }; + hashmap->iterators++; + *iterp = iter; } @@ -613,6 +621,9 @@ isc_hashmap_iter_destroy(isc_hashmap_iter_t **iterp) { *iterp = NULL; hashmap = iter->hashmap; isc_mem_put(hashmap->mctx, iter, sizeof(*iter)); + + INSIST(hashmap->iterators > 0); + hashmap->iterators--; } static isc_result_t