From: Willy Tarreau Date: Wed, 25 Oct 2017 07:59:22 +0000 (+0200) Subject: MEDIUM: connection: make use of CO_FL_WILL_UPDATE in conn_sock_shutw() X-Git-Tag: v1.8-rc1~227 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7b271b214fa5a750d6c93d429b72e7004b6168eb;p=thirdparty%2Fhaproxy.git MEDIUM: connection: make use of CO_FL_WILL_UPDATE in conn_sock_shutw() This one may be called by upper layers (eg: si_shutw()) or lower layers (si_shutw() as well during stream_int_notify()) so we want it to take care of updating the connection's flags if it's not going to be done by the caller. --- diff --git a/include/proto/connection.h b/include/proto/connection.h index c472c9a0fd..0044d8185e 100644 --- a/include/proto/connection.h +++ b/include/proto/connection.h @@ -420,7 +420,9 @@ static inline void conn_sock_stop_both(struct connection *c) conn_cond_update_sock_polling(c); } -/* shutdown management */ +/* read shutdown, called from the rcv_buf/rcv_pipe handlers when + * detecting an end of connection. + */ static inline void conn_sock_read0(struct connection *c) { c->flags |= CO_FL_SOCK_RD_SH; @@ -432,10 +434,16 @@ static inline void conn_sock_read0(struct connection *c) fdtab[c->handle.fd].linger_risk = 0; } +/* write shutdown, indication that the upper layer is not willing to send + * anything anymore and wants to close after pending data are sent. + */ static inline void conn_sock_shutw(struct connection *c) { c->flags |= CO_FL_SOCK_WR_SH; + conn_refresh_polling_flags(c); __conn_sock_stop_send(c); + conn_cond_update_sock_polling(c); + /* don't perform a clean shutdown if we're going to reset */ if (conn_ctrl_ready(c) && !fdtab[c->handle.fd].linger_risk) shutdown(c->handle.fd, SHUT_WR);