typedef struct { \
FR_DLIST_HEAD(fr_ ## _name ## _slab) reserved; \
FR_DLIST_HEAD(fr_ ## _name ## _slab) avail; \
+ fr_time_delta_t interval; \
fr_event_list_t *el; \
fr_event_timer_t const *ev; \
unsigned int elements_per_slab; \
*
* @param[in] _name used in type specific structures.
* @param[in] _type of structure returned by the reserve function.
- * @param[in] _interval between cleanup events.
*/
-#define FR_SLAB_FUNCS(_name, _type, _interval) \
+#define FR_SLAB_FUNCS(_name, _type) \
FR_DLIST_FUNCS(fr_ ## _name ## _slab, fr_ ## _name ## _slab_t, entry) \
FR_DLIST_FUNCS(fr_ ## _name ## _slab_element, fr_ ## _name ## _slab_element_t, entry) \
\
} \
slab_list->high_water_mark -= cleared; \
finish: \
- (void) fr_event_timer_in(slab_list, el, &slab_list->ev, _interval, _ ## _name ## _slab_cleanup, slab_list); \
+ (void) fr_event_timer_in(slab_list, el, &slab_list->ev, slab_list->interval, _ ## _name ## _slab_cleanup, slab_list); \
} \
\
/** Allocate a slab list to manage slabs of allocated memory \
* @param[in] ctx in which to allocate the slab list. \
* @param[out] out slab_list that has been allocated. \
* @param[in] el Event list in which to run clean up function. \
+ * @param[in] interval Interval between cleanup events. \
* @param[in] elements_per_slab How many elements should be allocated in each slab. \
* @param[in] min_elements Minimum number of elements to leave allocated. \
* @param[in] max_elements Maximun number of elements to allocate in slabs. \
static inline CC_HINT(nonnull(2)) int fr_ ## _name ## _slab_list_alloc(TALLOC_CTX *ctx, \
fr_ ## _name ## _slab_list_t **out, \
fr_event_list_t *el, \
+ fr_time_delta_t interval, \
unsigned int elements_per_slab, \
unsigned int min_elements, \
unsigned int max_elements, \
{ \
MEM(*out = talloc_zero(ctx, fr_ ## _name ## _slab_list_t)); \
(*out)->el = el; \
+ (*out)->interval = interval; \
(*out)->elements_per_slab = elements_per_slab; \
(*out)->min_elements = min_elements; \
(*out)->max_elements = max_elements; \
(*out)->reserve_init = reserve_init; \
fr_ ## _name ## _slab_init(&(*out)->reserved); \
fr_ ## _name ## _slab_init(&(*out)->avail); \
- if (el) (void) fr_event_timer_in(*out, el, &(*out)->ev, _interval, _ ## _name ## _slab_cleanup, *out); \
+ if (el) (void) fr_event_timer_in(*out, el, &(*out)->ev, interval, _ ## _name ## _slab_cleanup, *out); \
return 0; \
} \
\
FR_SLAB_TYPES(test, test_element_t)
-FR_SLAB_FUNCS(test, test_element_t, fr_time_delta_from_sec(1))
+FR_SLAB_FUNCS(test, test_element_t)
/** Test basic allocation and reservation of elements
*
/*
* Each slab will contain 2 elements, maximum of 4 elements allocated from slabs.
*/
- ret = fr_test_slab_list_alloc(NULL, &test_slab_list, NULL, 2, 1, 4, false, 0, 0, NULL, NULL, true, false);
+ ret = fr_test_slab_list_alloc(NULL, &test_slab_list, NULL, fr_time_delta_from_sec(1), 2, 1, 4, false, 0, 0, NULL, NULL, true, false);
TEST_CHECK(ret == 0);
TEST_CHECK(test_slab_list != NULL);
/*
* Each slab will contain 2 elements, maximum of 4 elements allocated from slabs.
*/
- ret = fr_test_slab_list_alloc(NULL, &test_slab_list, NULL, 2, 1, 4, true, 0, 0, NULL, NULL, true, false);
+ ret = fr_test_slab_list_alloc(NULL, &test_slab_list, NULL, fr_time_delta_from_sec(1), 2, 1, 4, true, 0, 0, NULL, NULL, true, false);
TEST_CHECK(ret == 0);
TEST_CHECK(test_slab_list != NULL);
test_uctx_t test_uctx;
int ret = -1;
- ret = fr_test_slab_list_alloc(NULL, &test_slab_list, NULL, 2, 1, 4, false, 0, 0, NULL, NULL, true, false);
+ ret = fr_test_slab_list_alloc(NULL, &test_slab_list, NULL, fr_time_delta_from_sec(1), 2, 1, 4, false, 0, 0, NULL, NULL, true, false);
TEST_CHECK(ret == 0);
TEST_CHECK(test_slab_list != NULL);
test_uctx_t test_uctx;
int ret = -1;
- ret = fr_test_slab_list_alloc(NULL, &test_slab_list, NULL, 2, 1, 4, false, 0, 0, NULL, NULL, false, false);
+ ret = fr_test_slab_list_alloc(NULL, &test_slab_list, NULL, fr_time_delta_from_sec(1), 2, 1, 4, false, 0, 0, NULL, NULL, false, false);
TEST_CHECK(ret == 0);
TEST_CHECK(test_slab_list != NULL);
test_uctx_t test_uctx;
int ret = -1;
- ret = fr_test_slab_list_alloc(NULL, &test_slab_list, NULL, 2, 1, 4, false, 0, 0, NULL, NULL, true, false);
+ ret = fr_test_slab_list_alloc(NULL, &test_slab_list, NULL, fr_time_delta_from_sec(1), 2, 1, 4, false, 0, 0, NULL, NULL, true, false);
TEST_CHECK(ret == 0);
TEST_CHECK(test_slab_list != NULL);
test_conf_t test_conf = { .initial = 10 };
int ret = -1;
- ret = fr_test_slab_list_alloc(NULL, &test_slab_list, NULL, 1, 1, 4, false, 0, 0, test_element_alloc, &test_conf, false, false);
+ ret = fr_test_slab_list_alloc(NULL, &test_slab_list, NULL, fr_time_delta_from_sec(1), 1, 1, 4, false, 0, 0, test_element_alloc, &test_conf, false, false);
TEST_CHECK(ret == 0);
TEST_CHECK(test_slab_list != NULL);
test_conf_t test_conf = { .initial = 10 };
int ret = -1;
- ret = fr_test_slab_list_alloc(NULL, &test_slab_list, NULL, 1, 1, 4, false, 0, 0, test_element_alloc, &test_conf, false, true);
+ ret = fr_test_slab_list_alloc(NULL, &test_slab_list, NULL, fr_time_delta_from_sec(1), 1, 1, 4, false, 0, 0, test_element_alloc, &test_conf, false, true);
TEST_CHECK(ret == 0);
TEST_CHECK(test_slab_list != NULL);
el = fr_event_list_alloc(ctx, NULL, NULL);
fr_event_list_set_time_func(el, test_time);
- ret = fr_test_slab_list_alloc(NULL, &test_slab_list, el, 2, 1, 6, false, 0, 0, NULL, NULL, true, false);
+ ret = fr_test_slab_list_alloc(NULL, &test_slab_list, el, fr_time_delta_from_sec(1), 2, 1, 6, false, 0, 0, NULL, NULL, true, false);
TEST_CHECK(ret == 0);
/*
el = fr_event_list_alloc(ctx, NULL, NULL);
fr_event_list_set_time_func(el, test_time);
- ret = fr_test_slab_list_alloc(NULL, &test_slab_list, el, 2, 16, 20, false, 0, 0, NULL, NULL, true, false);
+ ret = fr_test_slab_list_alloc(NULL, &test_slab_list, el, fr_time_delta_from_sec(1), 2, 16, 20, false, 0, 0, NULL, NULL, true, false);
TEST_CHECK(ret == 0);
/*
el = fr_event_list_alloc(ctx, NULL, NULL);
fr_event_list_set_time_func(el, test_time);
- ret = fr_test_slab_list_alloc(NULL, &test_slab_list, el, 2, 0, 20, false, 0, 0, NULL, NULL, true, false);
+ ret = fr_test_slab_list_alloc(NULL, &test_slab_list, el, fr_time_delta_from_sec(1), 2, 0, 20, false, 0, 0, NULL, NULL, true, false);
TEST_CHECK(ret == 0);
/*
el = fr_event_list_alloc(ctx, NULL, NULL);
fr_event_list_set_time_func(el, test_time);
- ret = fr_test_slab_list_alloc(NULL, &test_slab_list, el, 2, 0, 20, false, 0, 0, NULL, NULL, true, false);
+ ret = fr_test_slab_list_alloc(NULL, &test_slab_list, el, fr_time_delta_from_sec(1), 2, 0, 20, false, 0, 0, NULL, NULL, true, false);
TEST_CHECK(ret == 0);
/*
test_element_t *test_elements[2];
int ret = -1;
- ret = fr_test_slab_list_alloc(NULL, &test_slab_list, NULL, 2, 1, 2, true, 1, 128, NULL, NULL, false, false);
+ ret = fr_test_slab_list_alloc(NULL, &test_slab_list, NULL, fr_time_delta_from_sec(1), 2, 1, 2, true, 1, 128, NULL, NULL, false, false);
TEST_CHECK(ret == 0);
TEST_CHECK(test_slab_list != NULL);