[POOL] Added hash id to pool (#3196)

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.
This commit is contained in:
Sukchan Lee
2024-06-12 18:19:42 +09:00
parent dc2e167a8f
commit b26f1f310f
2 changed files with 47 additions and 7 deletions

View File

@@ -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)

View File

@@ -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();
}