Edata cache: add edata_cache_small_t.

This can be used to amortize the synchronization costs of edata_cache accesses.
This commit is contained in:
David Goldblatt
2020-02-18 17:21:40 -08:00
committed by David Goldblatt
parent 734109d9c2
commit 99b1291d17
3 changed files with 134 additions and 15 deletions

View File

@@ -17,38 +17,75 @@ test_edata_cache_destroy(edata_cache_t *edata_cache) {
}
TEST_BEGIN(test_edata_cache) {
edata_cache_t edc;
test_edata_cache_init(&edc);
edata_cache_t ec;
test_edata_cache_init(&ec);
/* Get one */
edata_t *ed1 = edata_cache_get(TSDN_NULL, &edc);
edata_t *ed1 = edata_cache_get(TSDN_NULL, &ec);
assert_ptr_not_null(ed1, "");
/* Cache should be empty */
assert_zu_eq(atomic_load_zu(&edc.count, ATOMIC_RELAXED), 0, "");
assert_zu_eq(atomic_load_zu(&ec.count, ATOMIC_RELAXED), 0, "");
/* Get another */
edata_t *ed2 = edata_cache_get(TSDN_NULL, &edc);
edata_t *ed2 = edata_cache_get(TSDN_NULL, &ec);
assert_ptr_not_null(ed2, "");
/* Still empty */
assert_zu_eq(atomic_load_zu(&edc.count, ATOMIC_RELAXED), 0, "");
assert_zu_eq(atomic_load_zu(&ec.count, ATOMIC_RELAXED), 0, "");
/* Put one back, and the cache should now have one item */
edata_cache_put(TSDN_NULL, &edc, ed1);
assert_zu_eq(atomic_load_zu(&edc.count, ATOMIC_RELAXED), 1, "");
edata_cache_put(TSDN_NULL, &ec, ed1);
assert_zu_eq(atomic_load_zu(&ec.count, ATOMIC_RELAXED), 1, "");
/* Reallocating should reuse the item, and leave an empty cache. */
edata_t *ed1_again = edata_cache_get(TSDN_NULL, &edc);
edata_t *ed1_again = edata_cache_get(TSDN_NULL, &ec);
assert_ptr_eq(ed1, ed1_again, "");
assert_zu_eq(atomic_load_zu(&edc.count, ATOMIC_RELAXED), 0, "");
assert_zu_eq(atomic_load_zu(&ec.count, ATOMIC_RELAXED), 0, "");
test_edata_cache_destroy(&edc);
test_edata_cache_destroy(&ec);
}
TEST_END
TEST_BEGIN(test_edata_cache_small) {
edata_cache_t ec;
edata_cache_small_t ecs;
test_edata_cache_init(&ec);
edata_cache_small_init(&ecs, &ec);
bool err = edata_cache_small_prepare(TSDN_NULL, &ecs, 2);
assert_false(err, "");
assert_zu_eq(ecs.count, 2, "");
assert_zu_eq(atomic_load_zu(&ec.count, ATOMIC_RELAXED), 0, "");
edata_t *ed1 = edata_cache_small_get(&ecs);
assert_zu_eq(ecs.count, 1, "");
assert_zu_eq(atomic_load_zu(&ec.count, ATOMIC_RELAXED), 0, "");
edata_t *ed2 = edata_cache_small_get(&ecs);
assert_zu_eq(ecs.count, 0, "");
assert_zu_eq(atomic_load_zu(&ec.count, ATOMIC_RELAXED), 0, "");
edata_cache_small_put(&ecs, ed1);
assert_zu_eq(ecs.count, 1, "");
assert_zu_eq(atomic_load_zu(&ec.count, ATOMIC_RELAXED), 0, "");
edata_cache_small_put(&ecs, ed2);
assert_zu_eq(ecs.count, 2, "");
assert_zu_eq(atomic_load_zu(&ec.count, ATOMIC_RELAXED), 0, "");
edata_cache_small_finish(TSDN_NULL, &ecs, 1);
assert_zu_eq(ecs.count, 1, "");
assert_zu_eq(atomic_load_zu(&ec.count, ATOMIC_RELAXED), 1, "");
test_edata_cache_destroy(&ec);
}
TEST_END
int
main(void) {
return test(
test_edata_cache);
test_edata_cache,
test_edata_cache_small);
}