7#include <freeradius-devel/util/acutest.h>
8#include <freeradius-devel/util/acutest_helpers.h>
9#include <freeradius-devel/util/timer.h>
32 .interval.value = 1 *
NSEC
56 test_slab_list_t *test_slab_list;
63 test_slab_list = test_slab_list_alloc(NULL, NULL, &
def_slab_config, NULL, NULL, NULL,
true,
false);
65 if (!test_slab_list)
return;
67 test_elements[0] = test_slab_reserve(test_slab_list);
76 if (test_elements[0]) test_elements[0]->
name = talloc_strdup(test_elements[0],
"Hello there");
77 if (test_elements[0]) test_slab_element_set_destructor(test_elements[0],
test_element_free, &test_uctx);
79 test_elements[1] = test_slab_reserve(test_slab_list);
81 TEST_CHECK(test_elements[1] != test_elements[0]);
86 test_elements[2] = test_slab_reserve(test_slab_list);
88 if (test_elements[2]) test_elements[2]->
name = talloc_strdup(test_elements[2],
"Hello there testing");
89 if (test_elements[2]) test_slab_element_set_destructor(test_elements[2],
test_element_free, &test_uctx2);
93 test_elements[3] = test_slab_reserve(test_slab_list);
99 test_elements[4] = test_slab_reserve(test_slab_list);
105 if (test_elements[0]) test_slab_release(test_elements[0]);
110 if (test_elements[1]) test_slab_release(test_elements[1]);
114 if (test_elements[2]) test_slab_release(test_elements[2]);
127 test_slab_list_t *test_slab_list;
135 test_slab_list = test_slab_list_alloc(NULL, NULL, &slab_config, NULL, NULL, NULL,
true,
false);
137 if (!test_slab_list)
return;
139 test_elements[0] = test_slab_reserve(test_slab_list);
144 test_elements[1] = test_slab_reserve(test_slab_list);
145 test_elements[2] = test_slab_reserve(test_slab_list);
146 test_elements[3] = test_slab_reserve(test_slab_list);
152 test_elements[4] = test_slab_reserve(test_slab_list);
165 test_slab_list_t *test_slab_list;
169 test_slab_list = test_slab_list_alloc(NULL, NULL, &
def_slab_config, NULL, NULL, NULL,
true,
false);
171 if (!test_slab_list)
return;
173 test_elements[0] = test_slab_reserve(test_slab_list);
180 if (test_elements[0]) test_elements[0]->
name = talloc_strdup(test_elements[0],
"Hello there");
181 if (test_elements[0]) test_slab_element_set_destructor(test_elements[0],
test_element_free, &test_uctx);
183 test_elements[1] = test_slab_reserve(test_slab_list);
185 TEST_CHECK(test_elements[1] != test_elements[0]);
187 test_elements[2] = test_slab_reserve(test_slab_list);
190 test_elements[3] = test_slab_reserve(test_slab_list);
193 if (test_elements[0]) test_slab_release(test_elements[0]);
201 test_elements[4] = test_slab_reserve(test_slab_list);
203 TEST_CHECK(test_elements[4] == test_elements[0]);
213 if (test_elements[4]) test_elements[4]->
name = talloc_strdup(test_elements[4],
"Different length string");
214 if (test_elements[4]) test_slab_release(test_elements[4]);
225 test_slab_list_t *test_slab_list;
229 test_slab_list = test_slab_list_alloc(NULL, NULL, &
def_slab_config, NULL, NULL, NULL,
false,
false);
231 if (!test_slab_list)
return;
233 test_elements[0] = test_slab_reserve(test_slab_list);
240 if (test_elements[0]) test_elements[0]->
name = talloc_strdup(test_elements[0],
"Hello there");
241 if (test_elements[0]) test_slab_element_set_destructor(test_elements[0],
test_element_free, &test_uctx);
243 test_elements[1] = test_slab_reserve(test_slab_list);
245 TEST_CHECK(test_elements[1] != test_elements[0]);
247 if (test_elements[0]) test_slab_release(test_elements[0]);
255 test_elements[2] = test_slab_reserve(test_slab_list);
257 TEST_CHECK(test_elements[2] == test_elements[0]);
258 if (test_elements[0] && test_elements[2])
TEST_CHECK(test_elements[2]->
name == test_elements[0]->
name);
265 if (test_elements[2]) test_elements[2]->
name = talloc_strdup(test_elements[2],
"Different length string");
266 if (test_elements[2]) test_slab_release(test_elements[2]);
278 test_slab_list_t *test_slab_list;
285 test_slab_list = test_slab_list_alloc(NULL, NULL, &
def_slab_config, NULL, NULL, NULL,
true,
false);
287 if (!test_slab_list)
return;
289 test_elements[0] = test_slab_reserve(test_slab_list);
292 if (test_elements[0]) test_slab_release(test_elements[0]);
294 test_elements[1] = test_slab_reserve(test_slab_list);
296 TEST_CHECK(test_elements[0] != test_elements[1]);
303 test_slab_list = test_slab_list_alloc(NULL, NULL, &
def_slab_config, NULL, NULL, NULL,
true,
true);
305 if (!test_slab_list)
return;
307 test_elements[0] = test_slab_reserve(test_slab_list);
310 if (test_elements[0]) test_slab_release(test_elements[0]);
312 test_elements[1] = test_slab_reserve(test_slab_list);
314 TEST_CHECK(test_elements[0] == test_elements[1]);
324 test_slab_list_t *test_slab_list;
328 test_slab_list = test_slab_list_alloc(NULL, NULL, &
def_slab_config, NULL, NULL, NULL,
true,
false);
330 if (!test_slab_list)
return;
332 test_element = test_slab_reserve(test_slab_list);
337 if (test_element) test_element->
name = talloc_strdup(test_element,
"Hello there");
338 if (test_element) test_slab_element_set_destructor(test_element,
test_element_free, &test_uctx);
358 test_slab_list_t *test_slab_list;
364 test_slab_list = test_slab_list_alloc(NULL, NULL, &slab_config,
test_element_alloc, NULL, &test_conf,
false,
false);
366 if (!test_slab_list)
return;
368 test_elements[0] = test_slab_reserve(test_slab_list);
370 TEST_CHECK(test_elements[0] && (test_elements[0]->num == 10));
375 if (test_elements[0]) {
376 test_elements[0]->
num = 5;
377 test_slab_release(test_elements[0]);
383 test_elements[1] = test_slab_reserve(test_slab_list);
385 TEST_CHECK(test_elements[1] == test_elements[0]);
386 if (test_elements[1])
TEST_CHECK(test_elements[1]->num == 5);
396 test_slab_list_t *test_slab_list;
402 test_slab_list = test_slab_list_alloc(NULL, NULL, &slab_config, NULL,
test_element_alloc, &test_conf,
false,
false);
404 if (!test_slab_list)
return;
406 test_elements[0] = test_slab_reserve(test_slab_list);
408 TEST_CHECK(test_elements[0] && (test_elements[0]->num == 10));
413 if (test_elements[0]) {
414 test_elements[0]->
num = 5;
415 test_slab_release(test_elements[0]);
421 test_elements[1] = test_slab_reserve(test_slab_list);
423 TEST_CHECK(test_elements[1] == test_elements[0]);
424 if (test_elements[1])
TEST_CHECK(test_elements[1]->num == 10);
441 test_slab_list_t *test_slab_list;
449 if (!test_slab_list)
return;
451 test_elements[0] = test_slab_reserve(test_slab_list);
453 TEST_CHECK(test_elements[0] && (test_elements[0]->num == 20));
458 if (test_elements[0]) {
459 test_elements[0]->
num = 5;
460 test_slab_release(test_elements[0]);
466 test_elements[1] = test_slab_reserve(test_slab_list);
468 TEST_CHECK(test_elements[1] == test_elements[0]);
469 if (test_elements[1])
TEST_CHECK(test_elements[1]->num == 20);
481 test_slab_list_t *test_slab_list;
490 test_slab_list = test_slab_list_alloc(NULL,
el, &slab_config, NULL, NULL, NULL,
true,
false);
492 if (!test_slab_list)
return;
497 for (i = 0; i < 6; i++) {
498 test_elements[i] = test_slab_reserve(test_slab_list);
507 for (i = 0; i < 4; i++) {
508 test_slab_release(test_elements[i]);
535 test_slab_list_t *test_slab_list;
545 test_slab_list = test_slab_list_alloc(NULL,
el, &slab_config, NULL, NULL, NULL,
true,
false);
547 if (!test_slab_list)
return;
552 for (i = 0; i < 20; i++) {
553 test_elements[i] = test_slab_reserve(test_slab_list);
562 for (i = 0; i < 20; i++) {
563 test_slab_release(test_elements[i]);
600 test_slab_list_t *test_slab_list;
610 test_slab_list = test_slab_list_alloc(NULL,
el, &slab_config, NULL, NULL, NULL,
true,
false);
612 if (!test_slab_list)
return;
617 for (i = 0; i < 20; i++) {
618 test_elements[i] = test_slab_reserve(test_slab_list);
627 for (i = 0; i < 20; i++) {
628 test_slab_release(test_elements[i]);
694 test_slab_list_t *test_slab_list;
704 test_slab_list = test_slab_list_alloc(NULL,
el, &slab_config, NULL, NULL, NULL,
true,
false);
706 if (!test_slab_list)
return;
711 for (i = 0; i < 20; i++) {
712 test_elements[i] = test_slab_reserve(test_slab_list);
721 for (i = 0; i < 20; i++) {
722 test_slab_release(test_elements[i]);
741 for (i = 0; i < 20; i++) {
742 test_elements[i] = test_slab_reserve(test_slab_list);
754 test_slab_list_t *test_slab_list;
761 test_slab_list = test_slab_list_alloc(NULL, NULL, &slab_config, NULL, NULL, NULL,
false,
false);
763 if (!test_slab_list)
return;
765 test_elements[0] = test_slab_reserve(test_slab_list);
767 test_elements[1] = test_slab_reserve(test_slab_list);
777 if (test_elements[0]) {
778 test_elements[0]->
name = talloc_strdup(test_elements[0],
"Hello there");
779 TEST_CHECK((
void *)test_elements[0]->
name > (
void *)test_elements[0]);
780 if (test_elements[1] && (test_elements[1] > test_elements[0])) {
781 TEST_CHECK((
void *)test_elements[0]->
name < (
void *)test_elements[1]);
782 TEST_MSG(
"element 0: %p, name %p, element 1: %p",
783 test_elements[0], test_elements[0]->
name, test_elements[1]);
#define TEST_CHECK_RET(_got, _exp)
void fr_event_service(fr_event_list_t *el)
Service any outstanding timer or file descriptor events.
int fr_event_corral(fr_event_list_t *el, fr_time_t now, bool wait)
Gather outstanding timer and file descriptor events.
fr_event_list_t * fr_event_list_alloc(TALLOC_CTX *ctx, fr_event_status_cb_t status, void *status_uctx)
Initialise a new event list.
Stores all information relating to an event list.
static fr_event_list_t * events
Resource pool management using slabs of memory.
#define FR_SLAB_FUNCS(_name, _type)
Define type specific wrapper functions for slabs and slab elements.
#define FR_SLAB_TYPES(_name, _type)
Define type specific wrapper structs for slabs and slab elements.
unsigned int min_elements
Minimum number of elements to keep allocated.
unsigned int max_elements
Maximum number of elements to allocate using slabs.
bool at_max_fail
Should requests for additional elements fail when the number in use has reached max_elements.
unsigned int elements_per_slab
Number of elements to allocate per slab.
unsigned int num_children
How many child allocations are expected off each element.
size_t child_pool_size
Size of pool space to be allocated to each element.
Tuneable parameters for slabs.
static fr_time_t test_time(void)
static void test_clearup_3(void)
Test that repeated clearing frees more slabs.
static void test_reserve(void)
Test that a reserve callback correctly initialises slab elements.
static fr_time_t test_time_base
static void test_init_reserve(void)
Test that reserve callback runs after init callback.
static fr_slab_config_t def_slab_config
static void test_reserve_mru(void)
Test that setting reserve_mru to true works.
static void test_clearup_2(void)
Test that slab clearing does not go beyond the minimum.
static void test_reuse_noreset(void)
Test that freeing an element makes it available for reuse with the element not reset between uses.
static void test_child_alloc(void)
static int test_element_reserve(test_element_t *elem, void *uctx)
static void test_clearup_1(void)
Test of clearing unused slabs.
static void test_free(void)
Test that talloc freeing an element results in destructor being called.
static void test_alloc(void)
Test basic allocation and reservation of elements.
static void test_reuse_reset(void)
Test that freeing an element makes it available for reuse with the element reset between uses.
static int test_element_free(test_element_t *elem, void *uctx)
static void test_init(void)
Test that a callback correctly initialises slab elements on first use.
static void test_alloc_fail(void)
Test allocation beyond max fails correctly.
static int test_element_alloc(test_element_t *elem, void *uctx)
static void test_realloc(void)
Test that reserving after clearup results in new slab allocation.
static TALLOC_CTX * talloc_init_const(char const *name)
Allocate a top level chunk with a constant name.
static fr_time_t fr_time_add_time_delta(fr_time_t a, fr_time_delta_t b)
static fr_time_delta_t fr_time_delta_from_sec(int64_t sec)
#define fr_time_wrap(_time)
void fr_timer_list_set_time_func(fr_timer_list_t *tl, fr_event_time_source_t func)
Override event list time source.
static fr_event_list_t * el