void invbloom_singleton_cb_(struct invbloom *ib,
void (*cb)(struct invbloom *,
- size_t bucket, void *),
+ size_t bucket, bool, void *),
void *data)
{
ib->singleton = cb;
return (u8 *)ib->idsum + bucket * ib->id_size;
}
-static void check_for_singleton(struct invbloom *ib, size_t bucket)
+static void check_for_singleton(struct invbloom *ib, size_t bucket, bool before)
{
if (!ib->singleton)
return;
if (ib->count[bucket] != 1 && ib->count[bucket] != -1)
return;
- ib->singleton(ib, bucket, ib->singleton_data);
+ ib->singleton(ib, bucket, before, ib->singleton_data);
}
static void add_to_bucket(struct invbloom *ib, size_t n, const u8 *id)
size_t i;
u8 *idsum = idsum_ptr(ib, n);
+ check_for_singleton(ib, n, true);
+
ib->count[n]++;
for (i = 0; i < ib->id_size; i++)
idsum[i] ^= id[i];
- check_for_singleton(ib, n);
+ check_for_singleton(ib, n, false);
}
static void remove_from_bucket(struct invbloom *ib, size_t n, const u8 *id)
size_t i;
u8 *idsum = idsum_ptr(ib, n);
+ check_for_singleton(ib, n, true);
+
ib->count[n]--;
for (i = 0; i < ib->id_size; i++)
idsum[i] ^= id[i];
- check_for_singleton(ib, n);
+ check_for_singleton(ib, n, false);
}
void invbloom_insert(struct invbloom *ib, const void *id)
if (ib->count[i] != count)
continue;
- id = tal_dup(ctx, u8, idsum_ptr(ib, i), ib->id_size, 0);
+ id = tal_dup_arr(ctx, u8, idsum_ptr(ib, i), ib->id_size, 0);
return id;
}
return NULL;
assert(ib1->id_size == ib2->id_size);
assert(ib1->salt == ib2->salt);
+ for (i = 0; i < ib1->n_elems; i++)
+ check_for_singleton(ib1, i, true);
+
for (i = 0; i < ib1->n_elems * ib1->id_size; i++)
ib1->idsum[i] ^= ib2->idsum[i];
for (i = 0; i < ib1->n_elems; i++) {
ib1->count[i] -= ib2->count[i];
- check_for_singleton(ib1, i);
+ check_for_singleton(ib1, i, false);
}
}