]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Move slab cleanup interval to be initialisation function parameter
authorNick Porter <nick@portercomputing.co.uk>
Mon, 30 Jan 2023 13:17:08 +0000 (13:17 +0000)
committerNick Porter <nick@portercomputing.co.uk>
Thu, 9 Feb 2023 12:13:00 +0000 (12:13 +0000)
Allows it to be sourced from a config option rather than hard coded in
function definition macro

src/lib/util/slab.h
src/lib/util/slab_tests.c

index 4d10a85c7acca924a836a4a2bdbd47c45340747e..e5aa5c71de15c84303d3a3b11e6741943236896c 100644 (file)
@@ -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; \
        } \
 \
index a42951794a8831835340f8cfa0eacfb57f1e2ba3..871a048c7eb162eba662fc1071ce3d5e575801c5 100644 (file)
@@ -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);