blob: b71368cba85c984d2e871d98cc4fe5888898e339 [file]
/* { dg-do run } */
/* Unit-test the alloc cache DS. */
#include <assert.h>
#include <stdint.h>
#include "alloc_cache.h"
int
main ()
{
struct alloc_cache cache;
init_alloc_cache (&cache);
/* Empty cache. Should return NULL. */
assert (alloc_cache_try_find (&cache, 16) == NULL);
assert (alloc_cache_try_find (&cache, 0) == NULL);
/* Populating it a bit. */
{
for (int i = 0; i < 5; i++)
{
uintptr_t x = 1 << i;
__auto_type n = alloc_cache_add_taken_node (&cache, (void *) x, x);
assert (n);
assert (n->allocation == (void *)x);
release_alloc_cache_node (n);
}
}
/* Taking five things, each of size 1, should return the whole cache. */
{
struct alloc_cache_node *n[5];
uint32_t gotten_nodes = 0;
for (int i = 0; i < 5; i++)
{
__auto_type node = n[i] = alloc_cache_try_find (&cache, 1);
uintptr_t x = (uintptr_t) node->allocation;
gotten_nodes |= x;
assert (x == 1
|| x == 2
|| x == 4
|| x == 8
|| x == 16);
}
assert (gotten_nodes == 0b11111);
/* ... and the cache should remain empty. */
assert (alloc_cache_try_find (&cache, 0) == NULL);
for (int i = 0; i < 5; i++)
release_alloc_cache_node (n[i]);
}
/* Taking 16 twice should fail the second time. */
{
__auto_type n = alloc_cache_try_find (&cache, 16);
assert (n != NULL && ((uintptr_t) n->allocation) == 16);
assert (alloc_cache_try_find (&cache, 16) == NULL);
release_alloc_cache_node (n);
}
}