MEDIUM: session: update the session's stick counters upon session_free()
Whenever session_free() is called, any possible stick counter stored in
the session will be synchronized.
diff --git a/include/proto/session.h b/include/proto/session.h
index 487f318..6d45d58 100644
--- a/include/proto/session.h
+++ b/include/proto/session.h
@@ -30,10 +30,37 @@
#include <types/global.h>
#include <types/session.h>
+#include <proto/stick_table.h>
+
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 */
/*