From: Nick Porter Date: Mon, 30 Jan 2023 13:17:08 +0000 (+0000) Subject: Move slab cleanup interval to be initialisation function parameter X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=18a4f236da7da082b24384d8da560e31ddab94e5;p=thirdparty%2Ffreeradius-server.git Move slab cleanup interval to be initialisation function parameter Allows it to be sourced from a config option rather than hard coded in function definition macro --- diff --git a/src/lib/util/slab.h b/src/lib/util/slab.h index 4d10a85c7ac..e5aa5c71de1 100644 --- a/src/lib/util/slab.h +++ b/src/lib/util/slab.h @@ -58,6 +58,7 @@ extern "C" { 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; \ @@ -99,9 +100,8 @@ extern "C" { * * @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) \ \ @@ -136,7 +136,7 @@ extern "C" { } \ 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 \ @@ -144,6 +144,7 @@ extern "C" { * @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. \ @@ -158,6 +159,7 @@ extern "C" { 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, \ @@ -171,6 +173,7 @@ extern "C" { { \ 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; \ @@ -183,7 +186,7 @@ extern "C" { (*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; \ } \ \ diff --git a/src/lib/util/slab_tests.c b/src/lib/util/slab_tests.c index a42951794a8..871a048c7eb 100644 --- a/src/lib/util/slab_tests.c +++ b/src/lib/util/slab_tests.c @@ -37,7 +37,7 @@ static fr_time_t test_time(void) 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 * @@ -52,7 +52,7 @@ static void test_alloc(void) /* * 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); @@ -123,7 +123,7 @@ static void test_alloc_fail(void) /* * 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); @@ -158,7 +158,7 @@ static void test_reuse_reset(void) 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); @@ -219,7 +219,7 @@ static void test_reuse_noreset(void) 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); @@ -272,7 +272,7 @@ static void test_free(void) 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); @@ -307,7 +307,7 @@ static void test_init_1(void) 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); @@ -345,7 +345,7 @@ static void test_init_2(void) 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); @@ -387,7 +387,7 @@ static void test_clearup_1(void) 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); /* @@ -438,7 +438,7 @@ static void test_clearup_2(void) 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); /* @@ -499,7 +499,7 @@ static void test_clearup_3(void) 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); /* @@ -589,7 +589,7 @@ static void test_realloc(void) 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); /* @@ -642,7 +642,7 @@ static void test_child_alloc(void) 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);