diff --git a/include/proto/channel.h b/include/proto/channel.h index 5e5d8228c..4872aa3cc 100644 --- a/include/proto/channel.h +++ b/include/proto/channel.h @@ -950,6 +950,7 @@ static inline void co_skip(struct channel *chn, int len) /* notify that some data was written to the SI from the buffer */ chn->flags |= CF_WRITE_PARTIAL | CF_WROTE_DATA; + chn_prod(chn)->flags &= ~SI_FL_RXBLK_ROOM; // si_rx_room_rdy() } /* HTX version of co_skip(). This function skips at most bytes from the @@ -967,6 +968,7 @@ static inline void co_htx_skip(struct channel *chn, struct htx *htx, int len) /* notify that some data was written to the SI from the buffer */ chn->flags |= CF_WRITE_PARTIAL | CF_WROTE_DATA; + chn_prod(chn)->flags &= ~SI_FL_RXBLK_ROOM; // si_rx_room_rdy() } } diff --git a/src/stream_interface.c b/src/stream_interface.c index 481938f8a..9b9a8e9fa 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -482,10 +482,6 @@ static void stream_int_notify(struct stream_interface *si) ic->rex = tick_add_ifset(now_ms, ic->rto); } - if ((sio->flags & SI_FL_RXBLK_ROOM) && - ((oc->flags & CF_WRITE_PARTIAL) || channel_is_empty(oc))) - si_rx_room_rdy(sio); - if (oc->flags & CF_DONT_READ) si_rx_chan_blk(sio); else @@ -761,6 +757,8 @@ int si_cs_send(struct conn_stream *cs) oc->flags |= CF_WRITE_PARTIAL | CF_WROTE_DATA; if (si->state == SI_ST_CON) si->state = SI_ST_RDY; + + si_rx_room_rdy(si_opposite(si)); } if (conn->flags & CO_FL_ERROR || cs->flags & (CS_FL_ERROR|CS_FL_ERR_PENDING)) { @@ -920,8 +918,7 @@ void si_sync_send(struct stream_interface *si) if (cs->conn->flags & CO_FL_ERROR) return; - if (si_cs_send(cs)) - si_rx_room_rdy(si_opposite(si)); + si_cs_send(cs); } /* Updates at once the channel flags, and timers of both stream interfaces of a