diff --git a/include/proto/session.h b/include/proto/session.h index 487f318ec..6d45d5805 100644 --- a/include/proto/session.h +++ b/include/proto/session.h @@ -30,10 +30,37 @@ #include #include +#include + extern struct pool_head *pool2_session; void session_free(struct session *sess); int init_session(); +/* Remove the refcount from the session to the tracked counters, and clear the + * pointer to ensure this is only performed once. The caller is responsible for + * ensuring that the pointer is valid first. + */ +static inline void session_store_counters(struct session *sess) +{ + void *ptr; + int i; + + for (i = 0; i < MAX_SESS_STKCTR; i++) { + struct stkctr *stkctr = &sess->stkctr[i]; + + if (!stkctr_entry(stkctr)) + continue; + + ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_CONN_CUR); + if (ptr) + stktable_data_cast(ptr, conn_cur)--; + stkctr_entry(stkctr)->ref_cnt--; + stksess_kill_if_expired(stkctr->table, stkctr_entry(stkctr)); + stkctr_set_entry(stkctr, NULL); + } +} + + #endif /* _PROTO_SESSION_H */ /* diff --git a/src/session.c b/src/session.c index e1e9f352d..caf8c1439 100644 --- a/src/session.c +++ b/src/session.c @@ -18,10 +18,13 @@ #include #include +#include + struct pool_head *pool2_session; void session_free(struct session *sess) { + session_store_counters(sess); pool_free2(pool2_session, sess); }