From b26f1f310f989086d5aaaa4b6a6da192c31f7023 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Wed, 12 Jun 2024 18:19:42 +0900 Subject: [PATCH] [POOL] Added hash id to pool (#3196) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pool library has the following issues with XXX_cycle, including mme_enb_cycle()/amf_ue_cycle() ``` INIT POOL(SIZE:5) Alloc Node1 Alloc Node2 Alloc Node3 Alloc Node4 Alloc Node5 Free Node4 Free Node3 PoolCycle(Node4) is NULL (Freed...OK!) PoolCycle(Node3) is NULL (Freed...OK!) Alloc Node6 Alloc Node7 PoolCycle(Node4) is Not NULL (Freed...but NOK!) PoolCycle(Node3) is Not NULL (Freed...but NOK!) PoolCycle(Node6) is Not NULL (Allocated...OK!) PoolCycle(Node7) is Not NULL (Allocated...OK!) ``` If we use ogs_poll_alloc() to create and allocate a node, the correct behavior of calling ogs_pool_free() on this node and then later calling ogs_pool_cycle() on this node must always return NULL. However, the behavior of calling ogs_pool_cycle() on this node in the future may return a “valid” pointer. To solve the problem, we added hash id to the pool memory and ogs_pool_find_by_id() function is added. --- lib/core/ogs-pool.h | 51 ++++++++++++++++++++++++++++++++++++------ tests/sctp/abts-main.c | 3 +++ 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/lib/core/ogs-pool.h b/lib/core/ogs-pool.h index eb435cffc..5df5a4f9f 100644 --- a/lib/core/ogs-pool.h +++ b/lib/core/ogs-pool.h @@ -28,7 +28,10 @@ extern "C" { #endif -typedef uint32_t ogs_pool_id_t; +#define OGS_MIN_POOL_ID 1 +#define OGS_MAX_POOL_ID 0x7fffffff + +typedef int32_t ogs_pool_id_t; #define OGS_POOL(pool, type) \ struct { \ @@ -36,6 +39,9 @@ typedef uint32_t ogs_pool_id_t; int head, tail; \ int size, avail; \ type **free, *array, **index; \ + \ + ogs_hash_t *id_hash; \ + ogs_pool_id_t id; \ } pool /* @@ -57,6 +63,9 @@ typedef uint32_t ogs_pool_id_t; (pool)->free[i] = &((pool)->array[i]); \ (pool)->index[i] = NULL; \ } \ + \ + (pool)->id_hash = ogs_hash_make(); \ + ogs_assert((pool)->id_hash); \ } while (0) /* @@ -70,6 +79,9 @@ typedef uint32_t ogs_pool_id_t; free((pool)->free); \ free((pool)->array); \ free((pool)->index); \ + \ + ogs_assert((pool)->id_hash); \ + ogs_hash_destroy((pool)->id_hash); \ } while (0) /* @@ -93,6 +105,9 @@ typedef uint32_t ogs_pool_id_t; (pool)->free[i] = &((pool)->array[i]); \ (pool)->index[i] = NULL; \ } \ + \ + (pool)->id_hash = ogs_hash_make(); \ + ogs_assert((pool)->id_hash); \ } while (0) /* @@ -108,14 +123,11 @@ typedef uint32_t ogs_pool_id_t; ogs_free((pool)->free); \ ogs_free((pool)->array); \ ogs_free((pool)->index); \ + \ + ogs_assert((pool)->id_hash); \ + ogs_hash_destroy((pool)->id_hash); \ } while (0) -#define ogs_pool_index(pool, node) (((node) - (pool)->array)+1) -#define ogs_pool_find(pool, _index) \ - (_index > 0 && _index <= (pool)->size) ? (pool)->index[_index-1] : NULL -#define ogs_pool_cycle(pool, node) \ - ogs_pool_find((pool), ogs_pool_index((pool), (node))) - #define ogs_pool_alloc(pool, node) do { \ *(node) = NULL; \ if ((pool)->avail > 0) { \ @@ -136,6 +148,31 @@ typedef uint32_t ogs_pool_id_t; } \ } while (0) +#define ogs_pool_index(pool, node) (((node) - (pool)->array)+1) +#define ogs_pool_find(pool, _index) \ + (_index > 0 && _index <= (pool)->size) ? (pool)->index[_index-1] : NULL +#define ogs_pool_cycle(pool, node) \ + ogs_pool_find((pool), ogs_pool_index((pool), (node))) + +#define ogs_pool_id_calloc(pool, node) do { \ + ogs_pool_alloc(pool, node); \ + if (*node) { \ + memset(*(node), 0, sizeof(**(node))); \ + (*(node))->id = OGS_NEXT_ID((pool)->id, 1, OGS_MAX_POOL_ID); \ + ogs_hash_set((pool)->id_hash, \ + &((*(node))->id), sizeof(ogs_pool_id_t), *(node)); \ + } \ +} while (0) + +#define ogs_pool_id_free(pool, node) do { \ + ogs_hash_set((pool)->id_hash, \ + &((node)->id), sizeof(ogs_pool_id_t), NULL); \ + ogs_pool_free(pool, node); \ +} while (0) + +#define ogs_pool_find_by_id(pool, id) \ + ogs_hash_get((pool)->id_hash, &id, sizeof(ogs_pool_id_t)) + #define ogs_pool_size(pool) ((pool)->size) #define ogs_pool_avail(pool) ((pool)->avail) diff --git a/tests/sctp/abts-main.c b/tests/sctp/abts-main.c index a9759eb57..67fa1a0d8 100644 --- a/tests/sctp/abts-main.c +++ b/tests/sctp/abts-main.c @@ -33,6 +33,9 @@ static void terminate(void) { ogs_sctp_final(); + ogs_app_config_final(); + ogs_app_context_final(); + ogs_pkbuf_default_destroy(); ogs_core_terminate(); }