summaryrefslogtreecommitdiffstats
path: root/src/ck_rhs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ck_rhs.c')
-rw-r--r--src/ck_rhs.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/ck_rhs.c b/src/ck_rhs.c
index 1d6b0f0..aaf1d71 100644
--- a/src/ck_rhs.c
+++ b/src/ck_rhs.c
@@ -914,6 +914,8 @@ ck_rhs_put_robin_hood(struct ck_rhs *hs,
long prev;
void *key;
long prevs[CK_RHS_MAX_RH];
+ int prev_probes[CK_RHS_MAX_RH];
+ long last_slot = -1;
unsigned int prevs_nb = 0;
unsigned int i;
@@ -938,8 +940,13 @@ restart:
if (ck_rhs_grow(hs, map->capacity << 1) == false) {
desc->in_rh = false;
- for (i = 0; i < prevs_nb; i++)
+ for (i = 0; i < prevs_nb; i++) {
+ if (i > 0)
+ ck_rhs_set_probes(map, prevs[i], prev_probes[i - 1]);
ck_rhs_unset_rh(map, prevs[i]);
+ }
+ if (last_slot != -1)
+ ck_rhs_set_probes(map, last_slot, prev_probes[prevs_nb - 1]);
return -1;
}
@@ -951,10 +958,13 @@ restart:
desc = ck_rhs_desc(map, first);
int old_probes = desc->probes;
+ last_slot = first;
+
desc->probes = n_probes;
h = ck_rhs_get_first_offset(map, first, n_probes);
ck_rhs_map_bound_set(map, h, n_probes);
prev = orig_slot;
+ prev_probes[prevs_nb] = old_probes;
prevs[prevs_nb++] = prev;
n_probes = old_probes;
goto restart;