#include <ccan/compiler/compiler.h>
#include <stdint.h>
#include <stdlib.h>
+#include <limits.h>
#include <stdbool.h>
#include <assert.h>
ht->priv = priv;
ht->elems = 0;
ht->deleted = 0;
- ht->max = (1 << ht->bits) * 2 / 3;
- ht->max_with_deleted = (1 << ht->bits) * 4 / 5;
+ ht->max = ((size_t)1 << ht->bits) * 3 / 4;
+ ht->max_with_deleted = ((size_t)1 << ht->bits) * 9 / 10;
/* This guarantees we enter update_common first add. */
ht->common_mask = -1;
ht->common_bits = 0;
ht->table[i] = make_hval(ht, new, get_hash_ptr_bits(ht, h)|perfect);
}
-static COLD_ATTRIBUTE bool double_table(struct htable *ht)
+static COLD bool double_table(struct htable *ht)
{
unsigned int i;
size_t oldnum = (size_t)1 << ht->bits;
ht->max *= 2;
ht->max_with_deleted *= 2;
- /* FIXME: If we lost our perfect bit, we could reclaim it here! */
+ /* If we lost our "perfect bit", get it back now. */
+ if (!ht->perfect_bit && ht->common_mask) {
+ for (i = 0; i < sizeof(ht->common_mask) * CHAR_BIT; i++) {
+ if (ht->common_mask & ((size_t)1 << i)) {
+ ht->perfect_bit = (size_t)1 << i;
+ break;
+ }
+ }
+ }
+
for (i = 0; i < oldnum; i++) {
if (entry_is_valid(e = oldtable[i])) {
void *p = get_raw_ptr(ht, e);
return true;
}
-static COLD_ATTRIBUTE void rehash_table(struct htable *ht)
+static COLD void rehash_table(struct htable *ht)
{
size_t start, i;
uintptr_t e;
}
/* We stole some bits, now we need to put them back... */
-static COLD_ATTRIBUTE void update_common(struct htable *ht, const void *p)
+static COLD void update_common(struct htable *ht, const void *p)
{
unsigned int i;
uintptr_t maskdiff, bitsdiff;