From e0ecee73b31b217d662526b889213a5d3eb843a8 Mon Sep 17 00:00:00 2001 From: luwenpeng Date: Fri, 13 Sep 2024 15:44:46 +0800 Subject: [PATCH] refactor(session manager): replace dep/list/list.h with sys/queue.h --- infra/session_manager/session_manager.c | 23 +++++++----------- infra/session_manager/session_pool.c | 24 +++++++++---------- infra/session_manager/session_private.h | 9 +++---- infra/session_manager/session_table.c | 31 ++++++++++--------------- infra/session_manager/session_timer.c | 5 ++++ 5 files changed, 42 insertions(+), 50 deletions(-) diff --git a/infra/session_manager/session_manager.c b/infra/session_manager/session_manager.c index ac78cd0..3b881ef 100644 --- a/infra/session_manager/session_manager.c +++ b/infra/session_manager/session_manager.c @@ -26,7 +26,7 @@ struct snowflake struct session_manager { - struct list_head evicte_queue; + struct session_list evicte_list; struct session_pool *sess_pool; struct session_timer *sess_timer; struct session_table *tcp_sess_table; @@ -550,7 +550,7 @@ static void session_manager_evicte_session(struct session_manager *mgr, struct s } } session_timer_del(mgr->sess_timer, sess); - list_add_tail(&sess->evicte, &mgr->evicte_queue); + TAILQ_INSERT_TAIL(&mgr->evicte_list, sess, evicte_tqe); switch (session_get_type(sess)) { @@ -977,7 +977,7 @@ struct session_manager *session_manager_new(const struct session_manager_config goto error; } - INIT_LIST_HEAD(&mgr->evicte_queue); + TAILQ_INIT(&mgr->evicte_list); session_transition_init(); mgr->now_ms = now_ms; mgr->last_clean_expired_sess_ts = now_ms; @@ -995,10 +995,9 @@ void session_manager_free(struct session_manager *mgr) if (mgr) { // free all evicted session - while (!list_empty(&mgr->evicte_queue)) + while ((sess = TAILQ_FIRST(&mgr->evicte_list))) { - sess = list_first_entry(&mgr->evicte_queue, struct session, evicte); - list_del(&sess->evicte); + TAILQ_REMOVE(&mgr->evicte_list, sess, evicte_tqe); session_manager_free_session(mgr, sess); } // free all udp session @@ -1234,16 +1233,12 @@ struct session *session_manager_get_expired_session(struct session_manager *mgr, struct session *session_manager_get_evicted_session(struct session_manager *mgr) { - if (list_empty(&mgr->evicte_queue)) + struct session *sess = TAILQ_FIRST(&mgr->evicte_list); + if (sess) { - return NULL; - } - else - { - struct session *sess = list_first_entry(&mgr->evicte_queue, struct session, evicte); - list_del(&sess->evicte); - return sess; + TAILQ_REMOVE(&mgr->evicte_list, sess, evicte_tqe); } + return sess; } // array_size at least EVICTE_SESSION_BURST, suggest 2 * EVICTE_SESSION_BURST diff --git a/infra/session_manager/session_pool.c b/infra/session_manager/session_pool.c index 11b6d57..8f1770f 100644 --- a/infra/session_manager/session_pool.c +++ b/infra/session_manager/session_pool.c @@ -7,7 +7,7 @@ struct session_pool { uint64_t capacity; uint64_t available; - struct list_head free_queue; + struct session_list free_list; }; struct session_pool *session_pool_new(uint64_t capacity) @@ -19,13 +19,13 @@ struct session_pool *session_pool_new(uint64_t capacity) } pool->available = 0; pool->capacity = capacity; - INIT_LIST_HEAD(&pool->free_queue); + TAILQ_INIT(&pool->free_list); struct session *array = (struct session *)(pool + 1); for (uint64_t i = 0; i < capacity; i++) { struct session *sess = &array[i]; - list_add_tail(&sess->free, &pool->free_queue); + TAILQ_INSERT_TAIL(&pool->free_list, sess, free_tqe); pool->available++; } @@ -36,10 +36,10 @@ void session_pool_free(struct session_pool *pool) { if (pool) { - while (!list_empty(&pool->free_queue)) + struct session *sess; + while ((sess = TAILQ_FIRST(&pool->free_list))) { - struct session *sess = list_first_entry(&pool->free_queue, struct session, free); - list_del(&sess->free); + TAILQ_REMOVE(&pool->free_list, sess, free_tqe); pool->available--; } @@ -55,15 +55,13 @@ struct session *session_pool_pop(struct session_pool *pool) return NULL; } - if (list_empty(&pool->free_queue)) + struct session *sess = TAILQ_FIRST(&pool->free_list); + if (sess) { - return NULL; + TAILQ_REMOVE(&pool->free_list, sess, free_tqe); + pool->available--; } - struct session *sess = list_first_entry(&pool->free_queue, struct session, free); - list_del(&sess->free); - pool->available--; - return sess; } @@ -74,7 +72,7 @@ void session_pool_push(struct session_pool *pool, struct session *sess) return; } - list_add_tail(&sess->free, &pool->free_queue); + TAILQ_INSERT_TAIL(&pool->free_list, sess, free_tqe); pool->available++; } diff --git a/infra/session_manager/session_private.h b/infra/session_manager/session_private.h index f1486c9..3afca43 100644 --- a/infra/session_manager/session_private.h +++ b/infra/session_manager/session_private.h @@ -7,7 +7,6 @@ extern "C" #include -#include "list.h" #include "tuple.h" #include "uthash.h" #include "timeout.h" @@ -51,9 +50,9 @@ struct session uint64_t timestamps[MAX_TIMESTAMP]; // realtime msec struct tcp_half tcp_halfs[MAX_FLOW_TYPE]; struct timeout timeout; - struct list_head lru; - struct list_head free; - struct list_head evicte; + TAILQ_ENTRY(session) lru_tqe; + TAILQ_ENTRY(session) free_tqe; + TAILQ_ENTRY(session) evicte_tqe; UT_hash_handle hh1; UT_hash_handle hh2; UT_hash_handle hh3; @@ -76,6 +75,8 @@ struct session struct session_manager_stat *mgr_stat; }; +TAILQ_HEAD(session_list, session); + void session_init(struct session *sess); void session_set_id(struct session *sess, uint64_t id); diff --git a/infra/session_manager/session_table.c b/infra/session_manager/session_table.c index b1e55a1..6e5e998 100644 --- a/infra/session_manager/session_table.c +++ b/infra/session_manager/session_table.c @@ -15,7 +15,7 @@ struct session_table void *arg; uint64_t count; - struct list_head lru_queue; + struct session_list lru_list; }; /****************************************************************************** @@ -93,7 +93,7 @@ struct session_table *session_table_new() } table->count = 0; - INIT_LIST_HEAD(&table->lru_queue); + TAILQ_INIT(&table->lru_list); return table; } @@ -106,7 +106,7 @@ void session_table_free(struct session_table *table) struct session *tmp = NULL; HASH_ITER(hh1, table->root_tuple6, node, tmp) { - list_del(&node->lru); + TAILQ_REMOVE(&table->lru_list, node, lru_tqe); HASH_DELETE(hh1, table->root_tuple6, node); HASH_DELETE(hh2, table->root_tuple4, node); HASH_DELETE(hh3, table->root_sessid, node); @@ -151,7 +151,7 @@ void session_table_add(struct session_table *table, struct session *sess) HASH_ADD(hh1, table->root_tuple6, tuple, sizeof(struct tuple6), sess); HASH_ADD(hh2, table->root_tuple4, tuple, sizeof(struct tuple4), sess); HASH_ADD(hh3, table->root_sessid, id, sizeof(uint64_t), sess); - list_add_tail(&sess->lru, &table->lru_queue); + TAILQ_INSERT_TAIL(&table->lru_list, sess, lru_tqe); table->count++; } @@ -162,10 +162,10 @@ void session_table_del(struct session_table *table, struct session *sess) return; } - list_del(&sess->lru); HASH_DELETE(hh1, table->root_tuple6, sess); HASH_DELETE(hh2, table->root_tuple4, sess); HASH_DELETE(hh3, table->root_sessid, sess); + TAILQ_REMOVE(&table->lru_list, sess, lru_tqe); if (table->free_cb) { table->free_cb(sess, table->arg); @@ -184,8 +184,8 @@ struct session *session_table_find_sessid(struct session_table *table, uint64_t HASH_FIND(hh3, table->root_sessid, &id, sizeof(uint64_t), sess); if (sess && !quiet) { - list_del(&sess->lru); - list_add_tail(&sess->lru, &table->lru_queue); + TAILQ_REMOVE(&table->lru_list, sess, lru_tqe); + TAILQ_INSERT_TAIL(&table->lru_list, sess, lru_tqe); } return sess; @@ -202,8 +202,8 @@ struct session *session_table_find_tuple6(struct session_table *table, const str HASH_FIND(hh1, table->root_tuple6, tuple, sizeof(struct tuple6), sess); if (sess && !quiet) { - list_del(&sess->lru); - list_add_tail(&sess->lru, &table->lru_queue); + TAILQ_REMOVE(&table->lru_list, sess, lru_tqe); + TAILQ_INSERT_TAIL(&table->lru_list, sess, lru_tqe); } return sess; @@ -220,8 +220,8 @@ struct session *session_table_find_tuple4(struct session_table *table, const str HASH_FIND(hh2, table->root_tuple4, tuple, sizeof(struct tuple4), sess); if (sess && !quiet) { - list_del(&sess->lru); - list_add_tail(&sess->lru, &table->lru_queue); + TAILQ_REMOVE(&table->lru_list, sess, lru_tqe); + TAILQ_INSERT_TAIL(&table->lru_list, sess, lru_tqe); } return sess; @@ -234,12 +234,5 @@ struct session *session_table_find_lru(struct session_table *table) return NULL; } - if (list_empty(&table->lru_queue)) - { - return NULL; - } - else - { - return list_first_entry(&table->lru_queue, struct session, lru); - } + return TAILQ_FIRST(&table->lru_list); } \ No newline at end of file diff --git a/infra/session_manager/session_timer.c b/infra/session_manager/session_timer.c index 83abe6a..7d0567b 100644 --- a/infra/session_manager/session_timer.c +++ b/infra/session_manager/session_timer.c @@ -1,6 +1,11 @@ #include "session_private.h" #include "session_timer.h" +#ifndef container_of +#define container_of(ptr, type, member) \ + (type *)((char *)(ptr) - (char *)&((type *)0)->member) +#endif + struct session_timer { struct timeouts *timeouts;