TRACE_ENTER(QMUX_EV_STRM_SEND, qcs->qcc->conn, qcs);
- /* Stream must not be woken up if already waiting for conn buffer. */
- BUG_ON(LIST_INLIST(&qcs->el_buf));
-
/* Sending forbidden if QCS is locally closed (FIN or RESET_STREAM sent). */
BUG_ON(qcs_is_close_local(qcs) || (qcs->flags & QC_SF_TO_RESET));
goto end;
}
+ if (LIST_INLIST(&qcs->el_buf)) {
+ TRACE_DEVEL("leaving on no buf avail", QMUX_EV_STRM_SEND, qcs->qcc->conn, qcs);
+ goto end;
+ }
+
if (qfctl_sblocked(&qcs->qcc->tx.fc)) {
TRACE_DEVEL("leaving on connection flow control",
QMUX_EV_STRM_SEND, qcs->qcc->conn, qcs);
TRACE_ENTER(QMUX_EV_STRM_SEND, qcs->qcc->conn, qcs);
- /* Stream must not be woken up if already waiting for conn buffer. */
- BUG_ON(LIST_INLIST(&qcs->el_buf));
-
/* Sending forbidden if QCS is locally closed (FIN or RESET_STREAM sent). */
BUG_ON(qcs_is_close_local(qcs) || (qcs->flags & QC_SF_TO_RESET));
goto end;
}
+ if (LIST_INLIST(&qcs->el_buf)) {
+ TRACE_DEVEL("leaving on no buf avail", QMUX_EV_STRM_SEND, qcs->qcc->conn, qcs);
+ qcs->sd->iobuf.flags |= IOBUF_FL_FF_BLOCKED;
+ goto end;
+ }
+
if (qfctl_sblocked(&qcs->qcc->tx.fc)) {
TRACE_DEVEL("leaving on connection flow control", QMUX_EV_STRM_SEND, qcs->qcc->conn, qcs);
if (!LIST_INLIST(&qcs->el_fctl)) {