+ /* If we lost our "perfect bit", get it back now. */
+ if (ht->perfect_bitnum == NO_PERFECT_BIT && ht->common_mask) {
+ for (i = 0; i < sizeof(ht->common_mask) * CHAR_BIT; i++) {
+ if (ht->common_mask & ((size_t)2 << i)) {
+ ht->perfect_bitnum = i;
+ break;
+ }
+ }
+ }
+
+ if (oldtable != &ht->common_bits) {
+ for (i = 0; i < oldnum; i++) {
+ if (entry_is_valid(e = oldtable[i])) {
+ void *p = get_raw_ptr(ht, e);
+ ht_add(ht, p, ht->rehash(p, ht->priv));
+ }
+ }
+ htable_free(ht, oldtable);
+ }
+ ht->deleted = 0;
+
+ (void)htable_debug(ht, HTABLE_LOC);
+ return true;
+}
+
+static COLD void rehash_table(struct htable *ht)
+{
+ size_t start, i;
+ uintptr_t e, perfect = ht_perfect_mask(ht);
+
+ /* Beware wrap cases: we need to start from first empty bucket. */
+ for (start = 0; ht->table[start]; start++);
+
+ for (i = 0; i < (size_t)1 << ht->bits; i++) {
+ size_t h = (i + start) & ((1 << ht->bits)-1);
+ e = ht->table[h];
+ if (!e)
+ continue;
+ if (e == HTABLE_DELETED)
+ ht->table[h] = 0;
+ else if (!(e & perfect)) {