/** @brief LRU structure base. */
#define lru_hash_struct \
uint32_t size; /**< Number of slots */ \
+ uint32_t evictions; /**< Number of evictions. */ \
uint32_t stride; /**< Stride of the 'slots' array */ \
lru_free_f evict; /**< Eviction function */ \
void *baton; /**< Passed to eviction function */
} slots[]; \
}
+/** Get slot at given index. */
+static inline void *lru_slot_at(struct lru_hash_base *lru, uint32_t id)
+{
+ return (struct lru_slot *)(lru->slots + (id * lru->stride));
+}
+
+/** Get pointer to slot value. */
+static inline void *lru_slot_val(struct lru_slot *slot, size_t offset)
+{
+ return ((char *)slot) + offset;
+}
+
/** @internal Slot data getter */
static inline void *lru_slot_get(struct lru_hash_base *lru, const char *key, uint32_t len, size_t offset)
{
return NULL;
}
uint32_t id = hash(key, len) % lru->size;
- struct lru_slot *slot = (struct lru_slot *)(lru->slots + (id * lru->stride));
+ struct lru_slot *slot = lru_slot_at(lru, id);
if (lru_slot_match(slot, key, len)) {
- return ((char *)slot) + offset;
+ return lru_slot_val(slot, offset);
}
return NULL;
}
return NULL;
}
uint32_t id = hash(key, len) % lru->size;
- struct lru_slot *slot = (struct lru_slot *)(lru->slots + (id * lru->stride));
+ struct lru_slot *slot = lru_slot_at(lru, id);
if (!lru_slot_match(slot, key, len)) {
if (slot->key) {
+ lru->evictions += 1;
free(slot->key);
if (lru->evict) {
- lru->evict(lru->baton, ((char *)slot) + offset);
+ lru->evict(lru->baton, lru_slot_val(slot, offset));
}
}
memset(slot, 0, lru->stride);
memcpy(slot->key, key, len);
slot->len = len;
}
- return ((char *)slot) + offset;
+ return lru_slot_val(slot, offset);
}
/**