]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: connection: make mux->detach() release the connection
authorWilly Tarreau <w@1wt.eu>
Sun, 8 Oct 2017 09:00:17 +0000 (11:00 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 31 Oct 2017 17:03:24 +0000 (18:03 +0100)
For H2, only the mux's timeout or other conditions might cause a
release of the mux and the connection, no stream should be allowed
to kill such a shared connection. So a stream will only detach using
cs_destroy() which will call mux->detach() then free the cs.

For now it's only handled by mux_pt. The goal is that the data layer
never has to care about the connection, which will have to be released
depending on the mux's mood.

include/proto/connection.h
src/mux_pt.c

index cae5dc34357caf6f7d7d0f70b1f2c2519d4d0365..4c952e0346dfa48805891c45e9d87845698c851a 100644 (file)
@@ -694,12 +694,7 @@ static inline void conn_free(struct connection *conn)
 /* Release a conn_stream, and kill the connection if it was the last one */
 static inline void cs_destroy(struct conn_stream *cs)
 {
-       struct connection *conn = cs->conn;
-
-       LIST_DEL(&conn->list);
-       conn_stop_tracking(conn);
-       conn_full_close(conn);
-       conn_free(conn);
+       cs->conn->mux->detach(cs);
        cs_free(cs);
 }
 
index e9a7d2f8cd129357ba19c76c98fda725b67b7a05..8a8aec0889e3827e4a6df7efed23138e67188796 100644 (file)
@@ -113,11 +113,16 @@ static struct conn_stream *mux_pt_attach(struct connection *conn)
 }
 
 /*
- * Detach the stream from the connection
- * (Used for outgoing connections)
+ * Detach the stream from the connection and possibly release the connection.
  */
 static void mux_pt_detach(struct conn_stream *cs)
 {
+       struct connection *conn = cs->conn;
+
+       LIST_DEL(&conn->list);
+       conn_stop_tracking(conn);
+       conn_full_close(conn);
+       conn_free(conn);
 }
 
 static void mux_pt_shutr(struct conn_stream *cs, enum cs_shr_mode mode)