summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorluwenpeng <[email protected]>2024-09-13 15:44:46 +0800
committerluwenpeng <[email protected]>2024-09-13 18:07:40 +0800
commite0ecee73b31b217d662526b889213a5d3eb843a8 (patch)
treeb7977b74403f54289bdd428e5b1c60c68012c373
parent244cc88ace762119d6d95e1a6b0216fe670d9d6d (diff)
refactor(session manager): replace dep/list/list.h with sys/queue.h
-rw-r--r--infra/session_manager/session_manager.c23
-rw-r--r--infra/session_manager/session_pool.c24
-rw-r--r--infra/session_manager/session_private.h9
-rw-r--r--infra/session_manager/session_table.c31
-rw-r--r--infra/session_manager/session_timer.c5
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))
- {
- return NULL;
- }
- else
+ struct session *sess = TAILQ_FIRST(&mgr->evicte_list);
+ if (sess)
{
- 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 <stdbool.h>
-#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;