From: Willy Tarreau Date: Mon, 25 Sep 2017 09:55:01 +0000 (+0200) Subject: MINOR: h2: update the {MUX,DEM}_{M,D}ALLOC flags on buffer availability X-Git-Tag: v1.8-rc1~46 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1b62c5caefbb3b29dea03f225404fe85cf4c98a2;p=thirdparty%2Fhaproxy.git MINOR: h2: update the {MUX,DEM}_{M,D}ALLOC flags on buffer availability Flag H2_CF_DEM_DALLOC is set when the demux buffer fails to be allocated in the recv() callback, and is cleared when it succeeds. Both flags H2_CF_MUX_MALLOC and H2_CF_DEM_MROOM are cleared when the mux buffer allocation succeeds. In both cases it will be up to the callers to report allocation failures. --- diff --git a/src/mux_h2.c b/src/mux_h2.c index 2d6d1b9859..759c6a15da 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -191,7 +191,9 @@ static int h2_dbuf_available(void *target) /* take the buffer now as we'll get scheduled waiting for ->wake() */ if (b_alloc_margin(&h2c->dbuf, 0)) { - conn_xprt_want_recv(h2c->conn); + h2c->flags &= ~H2_CF_DEM_DALLOC; + if (!(h2c->flags & H2_CF_DEM_BLOCK_ANY)) + conn_xprt_want_recv(h2c->conn); return 1; } return 0; @@ -232,11 +234,22 @@ static int h2_mbuf_available(void *target) /* take the buffer now as we'll get scheduled waiting for ->wake(). */ if (b_alloc_margin(&h2c->mbuf, 0)) { + if (h2c->flags & H2_CF_MUX_MALLOC) { + h2c->flags &= ~H2_CF_MUX_MALLOC; + if (!(h2c->flags & H2_CF_MUX_BLOCK_ANY)) + conn_xprt_want_send(h2c->conn); + } + + if (h2c->flags & H2_CF_DEM_MROOM) { + h2c->flags &= ~H2_CF_DEM_MROOM; + if (!(h2c->flags & H2_CF_DEM_BLOCK_ANY)) + conn_xprt_want_recv(h2c->conn); + } + /* FIXME: we should in fact call something like h2_update_poll() * now to recompte the polling. For now it will be enough like * this. */ - conn_xprt_want_recv(h2c->conn); return 1; } return 0; @@ -579,8 +592,10 @@ static void h2_recv(struct connection *conn) goto error; buf = h2_get_dbuf(h2c); - if (!buf) + if (!buf) { + h2c->flags |= H2_CF_DEM_DALLOC; return; + } /* note: buf->o == 0 */ max = buf->size - buf->i;