Since multiple streams can share one session attached to one listener,
the listener_release() call must be done in session_free() and not in
stream_free(), otherwise we end up with a negative count in H2.
void session_free(struct session *sess)
{
HA_ATOMIC_SUB(&sess->fe->feconn, 1);
+ if (sess->listener)
+ listener_release(sess->listener);
session_store_counters(sess);
vars_prune_per_sess(&sess->vars);
pool_free2(pool2_session, sess);
conn_full_close(conn);
conn_free(conn);
- listener_release(sess->listener);
-
task_delete(task);
task_free(task);
session_free(sess);
if (s->flags & SF_BE_ASSIGNED)
HA_ATOMIC_SUB(&s->be->beconn, 1);
- if (sess->listener)
- listener_release(sess->listener);
-
if (unlikely((global.mode & MODE_DEBUG) &&
(!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE)))) {
chunk_printf(&trash, "%08x:%s.closed[%04x:%04x]\n",