|
@@ -731,23 +731,23 @@ static int
|
|
|
hashindex_set(HashIndex *index, const unsigned char *key, const void *value)
|
|
|
{
|
|
|
int start_idx;
|
|
|
- int idx = hashindex_lookup(index, key, &start_idx);
|
|
|
+ int idx = hashindex_lookup(index, key, &start_idx); /* if idx < 0: start_idx -> EMPTY or DELETED */
|
|
|
uint8_t *ptr;
|
|
|
if(idx < 0)
|
|
|
{
|
|
|
if(index->num_entries > index->upper_limit) {
|
|
|
+ /* hashtable too full, grow it! */
|
|
|
if(!hashindex_resize(index, grow_size(index->num_buckets))) {
|
|
|
return 0;
|
|
|
}
|
|
|
- start_idx = hashindex_index(index, key);
|
|
|
+ /* we have just built a fresh hashtable and removed all tombstones,
|
|
|
+ * so we only have EMPTY or USED buckets, but no DELETED ones any more.
|
|
|
+ */
|
|
|
+ idx = hashindex_lookup(index, key, &start_idx);
|
|
|
+ assert(idx < 0);
|
|
|
+ assert(BUCKET_IS_EMPTY(index, start_idx));
|
|
|
}
|
|
|
idx = start_idx;
|
|
|
- while(!BUCKET_IS_EMPTY(index, idx) && !BUCKET_IS_DELETED(index, idx)) {
|
|
|
- idx++;
|
|
|
- if (idx >= index->num_buckets){
|
|
|
- idx -= index->num_buckets;
|
|
|
- }
|
|
|
- }
|
|
|
if(BUCKET_IS_EMPTY(index, idx)){
|
|
|
index->num_empty--;
|
|
|
if(index->num_empty < index->min_empty) {
|
|
@@ -758,14 +758,15 @@ hashindex_set(HashIndex *index, const unsigned char *key, const void *value)
|
|
|
/* we have just built a fresh hashtable and removed all tombstones,
|
|
|
* so we only have EMPTY or USED buckets, but no DELETED ones any more.
|
|
|
*/
|
|
|
- idx = start_idx = hashindex_index(index, key);
|
|
|
- while(!BUCKET_IS_EMPTY(index, idx)) {
|
|
|
- idx++;
|
|
|
- if (idx >= index->num_buckets){
|
|
|
- idx -= index->num_buckets;
|
|
|
- }
|
|
|
- }
|
|
|
+ idx = hashindex_lookup(index, key, &start_idx);
|
|
|
+ assert(idx < 0);
|
|
|
+ assert(BUCKET_IS_EMPTY(index, start_idx));
|
|
|
+ idx = start_idx;
|
|
|
}
|
|
|
+ } else if(BUCKET_IS_DELETED(index, idx)) {
|
|
|
+ /* as expected, nothing to do */
|
|
|
+ } else {
|
|
|
+ assert(0); /* bucket is full, must not happen! */
|
|
|
}
|
|
|
ptr = BUCKET_ADDR(index, idx);
|
|
|
memcpy(ptr, key, index->key_size);
|