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 2d6d1b9..759c6a1 100644
--- a/src/mux_h2.c
+++ b/src/mux_h2.c
@@ -191,7 +191,9 @@
/* 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 @@
/* 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 @@
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;