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.
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_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);
}
/*