From 4b795245914eac02c7d2b776f5b5086afd6f3a2f Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 5 Oct 2017 18:47:38 +0200 Subject: [PATCH] MEDIUM: mux_pt: make cs_shutr() / cs_shutw() properly close the connection Now these functions are able to automatically close both the transport and the socket layer, causing the whole connection to be torn down if needed. The two shutdown modes are implemented for both directions, and when a direction is closed, if it sees the other one is closed as well, it completes by closing the connection. This is similar to what is performed in the stream interface. It's not deployed yet but the purpose is to get rid of conn_full_close() where only conn_stream should be known. --- src/mux_pt.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/mux_pt.c b/src/mux_pt.c index e5d3dff..e9a7d2f 100644 --- a/src/mux_pt.c +++ b/src/mux_pt.c @@ -122,14 +122,24 @@ static void mux_pt_detach(struct conn_stream *cs) static void mux_pt_shutr(struct conn_stream *cs, enum cs_shr_mode mode) { + if (cs->flags & CS_FL_SHR) + return; if (conn_xprt_ready(cs->conn) && cs->conn->xprt->shutr) cs->conn->xprt->shutr(cs->conn, (mode == CS_SHR_DRAIN)); + if (cs->flags & CS_FL_SHW) + conn_full_close(cs->conn); } static void mux_pt_shutw(struct conn_stream *cs, enum cs_shw_mode mode) { + if (cs->flags & CS_FL_SHW) + return; if (conn_xprt_ready(cs->conn) && cs->conn->xprt->shutw) cs->conn->xprt->shutw(cs->conn, (mode == CS_SHW_NORMAL)); + if (!(cs->flags & CS_FL_SHR)) + conn_sock_shutw(cs->conn); + else + conn_full_close(cs->conn); } /* -- 1.7.10.4